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
$ 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 _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.