Re: a preprocessor bug (?) on processing a floating constant
Jonathan Wakely via Gcc-help <[email protected]>
| Newsgroups | gmane.comp.gcc.help |
|---|---|
| Message-ID | <CAH6eHdTFfE42RYdOpv9K88h1tkcrCVvKt_dyAZP+o11UscaDpg@mail.gmail.com> |
On Sat, 22 Nov 2025, 14:43 Andrew Makhorin via Gcc-help, < [email protected]> wrote: > [Sorry for duplicating my message.] > > Hi, > > > On preprocessing the program > > #define x 1.23 ## E+2 > > int main(void) > { > printf("x = %g\n", x); > return 0; > } > > the preprocessor generates the following > > $ gcc -E test.c > # 0 "test.c" > # 0 "<built-in>" > # 0 "<command-line>" > # 1 "/usr/include/stdc-predef.h" 1 3 4 > # 0 "<command-line>" 2 > # 1 "test.c" > > > int main(void) > { > printf("x = %g\n", 1.23E +2); > return 0; > } > > Since x results in two tokens "1.23E" and "+2" rather than in one token "1.23E+2", the compiler raises an error: > > test.c:1:14: error: exponent has no digits > 1 | #define x 1.23 ## E+2 > | ^~~~ > test.c:5:29: note: in expansion of macro 'x' > 5 | printf("x = %g\n", x); > | ^ > > On the other hand, the Standard says (3.1.8 Preprocessing Numbers): > > Preprocessing number tokens lexically include all floating and > integer constant tokens. > > Is it a preprocessor bug? Or I miss something? > I think GCC is correct. E+2 is not a single preprocessor token, so the ## operator pastes 1.23 and E but the +2 stays separate.