【问题标题】:#error inside of #define - Possible in C++ (generate error WHEN calling macro MyMacro IF some constant is not defined)?#define 中的#error - 在 C++ 中可能(如果未定义某些常量,则在调用宏 MyMacro 时生成错误)?
【发布时间】:2014-06-12 19:09:57
【问题描述】:

我想定义一个宏,基于某些条件(#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() 并且尚未定义INITED 时生成错误

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

【问题讨论】:

  • 我很确定这是不可能的。这需要预处理器多次通过代码,我很确定它不会这样做。

标签: c++ c macros conditional-compilation ifdefine


【解决方案1】:

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

但是,您可以使用 C++11 及更高版本查看静态断言,而不是您的 #error 指令。你会这样写:

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

【讨论】:

  • 我明白了。但是有没有办法以其他方式实现我想要的?我不知道您所说的“两阶段预处理”究竟是什么意思。
  • @PolGraphic:使用静态断言。
猜你喜欢
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多