I have created and applied a simple .xcconfig file containing
GCC_PREPROCESSOR_DEFINITIONS[config=Debug] = FOODEBUG
GCC_PREPROCESSOR_DEFINITIONS[config=Release] = FOORELEASE
and main.cpp containing
#include <iostream>
// This warning IS shown
#if DEBUG
#warning DEBUG is set to 1
#endif
// This warning IS NOT shown
#ifdef FOODEBUG
#warning FOODEBUG is set
#endif
// This warning IS NOT shown
#ifdef FOORELEASE
#warning FOORELEASE is set
#endif
int main(int argc, const char * argv[])
{
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
Now I'm wondering why in main.cpp, neither FOODEBUG nor FOORELEASE are defined ??!
As expected, the build settings show the two lines of my .xcconfig file ("Any Architecture | Any SDK"), but they are not actually used.
How could I achieve that?
If you have a preprocessor macro you need to give it a value to be able to use it as you do, see a screenshot of one of my project setups as a sample:
The reason why you can access DEBUG is difference is the different behaviour between
#if
and#ifdef
.#if
will be true when the macro exists,#ifdef
if it has a non zero value. I suggest to always assign the value one to be save, because I'm not sure the above is true for all compiler versions.UPDATE:
Did not know that before, but it seems
config=Debug
does not work. Although the macros get visible in the settings, they do not inherit up. What does work is 2 xcconfig files similar to this:Release.xcconfig:
Debug.xcconfig
Please also see James Moores answer here: How to append values in xcconfig variables?