Reputation: 22526
I am compiling my program that will run on linux gcc 4.4.1 C99.
I was just putting my #defines
in to separate the code that will be compiled on either windows or linux. However, I got this error.
error: macro names must be identifiers.
Using this code
#ifdef(WIN32)
/* Do windows stuff */
#elif(UNIX)
/* Do linux stuff */
#endif
However, when I changed to this the error was fixed:
#if defined(WIN32)
/* Do windows stuff */
#elif(UNIX)
/* Do linux stuff */
#endif
Why did I get that error and why the #defines
are different?
Upvotes: 199
Views: 151483
Reputation: 29985
With C23, you can use #elifdef
and #elifndef
:
#ifdef WIN32
/* Do windows stuff */
#elifdef UNIX
/* Do linux stuff */
#endif
Upvotes: 1
Reputation: 6083
If you use #ifdef syntax, remove the parenthesis.
The difference between the two is that #ifdef
can only use a single condition,
while #if defined(NAME)
can do compound conditionals.
For example in your case:
#if defined(WIN32) && !defined(UNIX)
/* Do windows stuff */
#elif defined(UNIX) && !defined(WIN32)
/* Do linux stuff */
#else
/* Error, both can't be defined or undefined same time */
#endif
Upvotes: 281
Reputation: 819
#ifdef FOO
and
#if defined(FOO)
are the same,
but to do several things at once, you can use defined, like
#if defined(FOO) || defined(BAR)
Upvotes: 81
Reputation: 15969
#ifdef
checks whether a macro by that name has been defined, #if
evaluates the expression and checks for a true value
#define FOO 1
#define BAR 0
#ifdef FOO
#ifdef BAR
/* this will be compiled */
#endif
#endif
#if BAR
/* this won't */
#endif
#if FOO || BAR
/* this will */
#endif
Upvotes: 37