Boolean in ifdef: is "#ifdef A && B" the same as "#if defined(A) && defined(B)"?

C++C PreprocessorConditional Compilation

C++ Problem Overview


In C++, is this:

#ifdef A && B

the same as:

#if defined(A) && defined(B)

?

I was thinking it wasn't, but I haven't been able to find a difference with my compiler (VS2005).

C++ Solutions


Solution 1 - C++

They are not the same. The first one doesn't work (I tested in gcc 4.4.1). Error message was:

> test.cc:1:15: warning: extra tokens at > end of #ifdef directive

If you want to check if multiple things are defined, use the second one.

Solution 2 - C++

Conditional Compilation

> You can use the defined operator in > the #if directive to use expressions > that evaluate to 0 or 1 within a > preprocessor line. This saves you from > using nested preprocessing directives. > The parentheses around the identifier > are optional. For example: >
> > #if defined (MAX) && ! defined (MIN)
> > Without using the defined operator, > you would have to include the > following two directives to perform > the above example: > > #ifdef max > #ifndef min

Solution 3 - C++

The following results are the same:

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2.

#ifdef A
#ifdef B
printf("define test");
#endif
#endif

Solution 4 - C++

For those that might be looking for example (UNIX/g++) that is a little different from the OP, this may help:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif

Solution 5 - C++

As of VS2015 none of the above works. The correct directive is:

#if (MAX && !MIN)

see more here

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncriddellView Question on Stackoverflow
Solution 1 - C++Evan TeranView Answer on Stackoverflow
Solution 2 - C++Svetlozar AngelovView Answer on Stackoverflow
Solution 3 - C++way goodView Answer on Stackoverflow
Solution 4 - C++MikeBView Answer on Stackoverflow
Solution 5 - C++FabriView Answer on Stackoverflow