4

我想定义宏,基于某些条件(存在#define INITED,而不是宏的参数)将返回值,或生成编译器的错误,例如:

#error Not initialized!

我试过(对于myIdea.h):

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #define MyMacro(x) #error Not initalized!
#endif

但是该代码会产生错误(不是我想要的)expected macro format parameter

请注意,我不想要该代码(工作,但做一些不同的事情):

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #error Not initalized!
#endif

上面的代码将在未定义 INITED 时产生错误。我只想在调用MyMacro()AND INITED has not been defined时生成错误。

我不是第一个代码的奴隶,但我希望结果完全按照我上面描述的方式工作(在调用宏MyMacro IF 常量未定义时生成错误)。

4

1 回答 1

6

这是不可能的。预处理器只是一个非常简单的东西,它不会像那样解析嵌套的宏。第二个井号 ( #) 不会被预处理器理解为嵌套宏。该参数几乎作为原始字符串处理。

但是,您可以使用 C++11 和 on 而不是您的#error指令来查看静态断言。你会写这样的东西:

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #define MyMacro(x) static_assert(false, "Not initalized!");
#endif
于 2014-04-27T07:54:59.877 回答