Search code examples
cgccc-preprocessor

How to catch undefined macro in preprocessor #if condition?


Based on this question How to catch empty defined macro with gcc? I have another problem. How to catch undefined macro in preprocessor #if condition? Example code:

#include <stdio.h> 

int main()
{
#if ENABLE_SOMETHING == 1
    ... do something ..
#endif
 return 0;
}

Is there a way to catch error/warning when ENABLE_SOMETHING is not set using gcc compiler(maybe some flag)? Or maybe there are external tools which I can use?


I know than i can write something like this :

#ifndef ENABLE_SOMETHING
    #error "ENABLE_SOMETHING undefined!"
#endif

But I have a huge amount of different defines(ENABLE_STH1, ENABLE_STH2, ENALBE_STH3 ... etc.) in code and i don't want to fix this manually. I'm looking for some automatic solution for our project.


Solution

  • Is there a way to catch error/warning when ENABLE_SOMETHING is not set using gcc compiler(maybe some flag)?

    With GCC you can use the -Wundef flag (clang supports it as well).

    From the official documentation

    -Wundef

    Warn if an undefined identifier is evaluated in an #if directive. Such identifiers are replaced with zero.

    EDIT:

    For example, this C-code:

    #include <stdio.h>
    
    int main(void)
    {
    #if UNDEFINED_MACRO
      printf("hi mum!\n");
    #endif
    
      return 0;
    }
    

    ... compiled with GCC and the -Wundef flag yields this:

    $ gcc undef.c -Wundef
    undef.c: In function 'main':
    undef.c:5:5: warning: "UNDEFINED_MACRO" is not defined [-Wundef]
     #if UNDEFINED_MACRO
         ^