我想定义宏,它基于某种条件(存在#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()
并且尚未定义INIt_rstrong时,我只想生成错误。我不是第一个代码的奴隶,但是我希望结果能按上述方法正常工作(在调用未初始化的宏MyMacro IF常量时定义时会产生错误)。
最佳答案
这是不可能的。预处理器只是一件非常简单的事情,它不会像这样解析嵌套的宏。预处理器不会将第二个磅(#
)理解为嵌套宏。该参数几乎作为原始字符串处理。
但是,您可以使用C++ 11及更高版本查看静态断言,而不是使用#error
指令。您将正在编写如下内容:
#ifdef INITED
#define MyMacro(x) x->method(); //something with x
#else
#define MyMacro(x) static_assert(false, "Not initalized!");
#endif