有没有办法让C预处理器解析#error语句中的宏?

时间:2011-05-14 14:55:41

标签: c++ c-preprocessor

正如标题所说。我想在#error语句的文本中使用预处理器宏:

#define SOME_MACRO 1

#if SOME_MACRO != 0
    #error "SOME_MACRO was not 0; it was [value of SOME_MACRO]"
#endif

在这个例子中,我希望预处理器将[value of SOME_MACRO]解析为SOME_MACRO的实际值,在本例中为1.这应该在预处理器,编译器或任何进程之前发生#error打印错误输出
有没有办法做到这一点,或者这是不可能的?

我不想知道是否有ISO C ++标准方法可以做到这一点,因为afaik预处理器指令#error未在任何ISO C ++标准中声明。但是,我知道GCC和Visual C ++支持#error。但我的问题不是那些编译器特有的,我只是好奇,如果任何C / C ++编译器/预处理器可以做到这一点。

我试图搜索该主题,但没有任何运气。

3 个答案:

答案 0 :(得分:5)

在Visual Studio中,您可以使用pragma message,如下所示:

#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

这将生成两条消息,但您将获得SOME_MACRO的值。在G ++中使用以下代码( from comments:g ++ version 4.3.4适用于括号,如上面的代码):

#pragma message "SOME_MACRO was not 0; it was " STRING(SOME_MACRO)

答案 1 :(得分:5)

为了完整性我建议的C ++ 0x方式(使用与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);

给出:

g++ -Wall -Wextra -std=c++0x test.cc                     
test.cc:9: error: static assertion failed: "Expecting VALUE==0 [VALUE: 1]"

答案 2 :(得分:3)

#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

在Visual Studio 2005中生成“无法打开包含文件:'invalid_macro_value_1':没有此类文件或目录”,并且可能在其他编译器上生成类似的消息。

这不能直接回答你关于使用#error的问题,但结果是相似的。