Is there a way to have the C Preprocessor resolve macros in an #error statement?

后端 未结 3 1251
甜味超标
甜味超标 2021-02-20 04:57

Just as the title says. I want to use a preprocessor macro in the text of an #error statement:

#define SOME_MACRO 1

#if SOME_MACRO != 0
    #error \"SOME_MACRO          


        
相关标签:
3条回答
  • 2021-02-20 05:34
    #define INVALID_MACRO_VALUE2(x) <invalid_macro_value_##x>
    #define INVALID_MACRO_VALUE(x) INVALID_MACRO_VALUE2(x)
    
    #if SOME_MACRO != 0
      #include INVALID_MACRO_VALUE(SOME_MACRO)
    #endif
    

    generates "Cannot open include file: 'invalid_macro_value_1': No such file or directory" in Visual Studio 2005 and probably similar messages on other compilers.

    This doesn't answer your question directly about using #error, but the result is similar.

    0 讨论(0)
  • 2021-02-20 05:39

    For completeness the C++0x way I suggested (using the same trick as Kirill):

    #define STRING2(x) #x
    #define STRING(x) STRING2(x)
    
    #define EXPECT(v,a) static_assert((v)==(a), "Expecting " #v "==" STRING(a) " [" #v ": "  STRING(v) "]")
    
    
    #define VALUE 1
    
    EXPECT(VALUE, 0);
    

    Gives:

    g++ -Wall -Wextra -std=c++0x test.cc                     
    test.cc:9: error: static assertion failed: "Expecting VALUE==0 [VALUE: 1]"
    
    0 讨论(0)
  • 2021-02-20 05:52

    In Visual Studio you can use pragmamessage as follows:

    #define STRING2(x) #x
    #define STRING(x) STRING2(x)
    
    #define SOME_MACRO 1
    
    #if SOME_MACRO != 0
        #pragma message ( "SOME_MACRO was not 0; it was " STRING(SOME_MACRO) )
        #error SOME_MACRO was not 0;
    #endif
    

    This will generate two messages, but you'll get the value of SOME_MACRO. In G++ use the following instead (from comments: g++ version 4.3.4 works well with parenthesis as in the code above):

    #pragma message "SOME_MACRO was not 0; it was " STRING(SOME_MACRO)
    
    0 讨论(0)
提交回复
热议问题