【问题标题】:In C++ can one use a macro to define a macro using an argument as the macro name? [duplicate]在 C++ 中,可以使用一个宏来定义一个使用参数作为宏名称的宏吗? [复制]
【发布时间】:2017-12-11 01:04:15
【问题描述】:

我想用一个宏在 C++ 中定义另一个宏。如果定义宏的宏有两个参数,一个是要对其执行“#ifdef”测试的宏的名称,另一个是要执行 #define 的新宏的名称。这个例子被删减了。实际情况很复杂,所以我想把它排除在外。

#define TEST_ME // or NOT 


#define DEFINE_A_MACRO( _test_me_, _define_me_ )    \
                                                    \
    #ifdef (actual value of)_test_me_                 \
         #define (actual value of _define_me_) One Thing \
    #else                                                  \
         #define (actual value of _define_me_) Another Thing \
    #endif 

 ...

  DEFINE_A_MACRO( TEST_ME, DEFINE_ME )

有没有办法做到这一点? 我对此表示怀疑,但不妨提出问题:)

【问题讨论】:

  • 宏扩展不能包含预处理指令。
  • 在#define 宏中转义# 符号?与它回答“是”的问题不同,您可以在宏中转义哈希符号,但它也回答了这个问题,因为其中一个回答说它不会“重新扫描”宏内容并应用现在扩展的预处理器指令。对于这个问题,答案是否定的——这种措辞在搜索中可能很好用。

标签: c++ macros preprocessor


【解决方案1】:

没有。虽然预处理器可以支持多个级别的令牌替换(一个宏可以引用另一个宏),但这仅适用于令牌。您不能生成新的预处理器指令。

换句话说,你解决这个问题

#ifdef TEST_ME
  #define THING ONETHING
#else
  #define THING ANOTHERTHING
#endif
#define DEFINE_ME THING

(或者通过编写 C++ 代码 - 现在真的不需要宏)

【讨论】:

  • 通常需要它们来为具有公共源的不同版本的库定义平台特定代码。微软不得不声明项目 dllimport dll 导出或不依赖于链接和构建类型的讨厌位
  • 我选择了这个作为答案,尽管我希望它是可能的,但 NO 是一个有效的答案。
猜你喜欢
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多