【问题标题】:Is there any way to convert a variable macro into 0 or 1 based on whether it is defined?有没有办法根据是否定义变量宏将其转换为 0 或 1?
【发布时间】:2013-10-25 20:15:18
【问题描述】:

我想定义一个宏,它可以将另一个宏作为参数,如果没有定义则返回0,如果是则返回1

预处理器有一个称为defined 的操作符,它正是这样做的,但它只在#if 指令中可用。我想知道我是否可以在 #if 之外以某种方式公开此功能,例如在一行 C++ 代码的中间。

这一般可以吗,如果可以,怎么做?

【问题讨论】:

  • 您必须知道预处理器将任何未定义的宏视为错误。如果您真正需要的只是条件编译,则可以依赖它。
  • 据我了解,您正在尝试检查是否在运行时定义了宏,但宏在预处理(编译前)时被扩展,所以这是不可能的。
  • 实际上,我想在编译时使用它。宏将在编译时在命令行上定义。我只是不想为每个可能定义的变量添加一个新的宏块。
  • @merlin2011 你不能那样做。 (幸运?不幸?)
  • @merlin2011 您是否研究过在编译器的命令行上为宏定义值的能力(然后您总是会使用显式值 0 或 1 指定宏)?我不确定这是否会更容易,但不知道您的最终目标或编译器,如果您尚未考虑,这可能适合您的需求。

标签: c++ macros c-preprocessor


【解决方案1】:

据我了解,您想要像下面这样的东西,不幸的是,不可能

#define IS_DEFINED_MACRO(X) #ifdef(X) 1 #else 0 #endif  // IMPOSSIBlE!

int x = IS_DEFINED_MACRO(MACRO_TO_TEST);

唯一可能的方法是

#ifdef MACRO_TO_TEST
   #define IT_IS_DEFINED 1
#else
   #define IT_IS_DEFINED 0
#endif

【讨论】:

    【解决方案2】:

    我阅读了您的评论“正是为了实际 C++ 代码的目的,未在命令行上定义的宏可以默认为 0”。

    您可以做的一件事就是为每个相应的宏定义一个默认值:

    #ifndef WIBBLE
    #define WIBBLE 0
    #endif
    

    然后在编译时,可以选择将-DWIBBLE=100 传递给编译器以覆盖默认值。

    【讨论】:

    • 为每个宏添加 3 行代码。我试图避免这样做,因为可能的宏可能很大。
    • @merlin2011:很多配置程序所做的就是编写一个config.h文件的生成脚本,这样程序员就不需要过多的输入了。
    猜你喜欢
    • 2018-10-23
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2017-12-21
    相关资源
    最近更新 更多