Ok, so I've encountered this twice in 24 hours. So it's probably worth talking about it.
The preprocessor does a simple text substitution as it works its way through your source files. Sometimes this has "unanticipated" side-effects. When this happens, you'll normally get a "hey, this makes no sense at all" error from the compiler. Here's an example:
$ more c.c #include <ucontext.h> #include <stdio.h> int main() { int FS; FS=0; printf("FS=%i",FS); } $ CC c.c $ CC c.c "c.c", line 6: Error: Badly formed expression. "c.c", line 7: Error: The left operand must be an lvalue. 2 Error(s) detected.
A similar thing happens with g++:
$ /pkg/gnu/bin/g++ c.c c.c: In function 'int main()': c.c:6:7: error: expected unqualified-id before numeric constant c.c:7:6: error: lvalue required as left operand of assignment
The Studio C compiler gives a bit more of a clue what is going on. But it's not something you can rely on:
$ cc c.c "c.c", line 6: syntax error before or at: 1 "c.c", line 7: left operand must be modifiable lvalue: op "="
As you can guess the issue is that FS gets substituted. We can find out what happens by examining the preprocessed source:
$ CC -P c.c $ tail c.i int main ( ) { int 1 ; 1 = 0 ; printf ( "FS=%i" , 1 ) ; }
You can confirm this using -xdumpmacros
to dump out the macros as they are defined. You can combine this with -H to see which header files are included:
$ CC -xdumpmacros c.c 2>&1 |grep FS #define _SYS_ISA_DEFS_H #define _FILE_OFFSET_BITS 32 #define REG_FSBASE 26 #define REG_FS 22 #define FS 1 ....
If you're using gcc you should use the -E option to get preprocessed source, and the -dD option to get definitions of macros and the include files.
No comments:
Post a Comment