【问题标题】:Can I conditionally replace preprocessor arguments?我可以有条件地替换预处理器参数吗?
【发布时间】:2012-06-19 14:39:31
【问题描述】:

在使用单元测试框架时,我遇到了一种我想测试宏参数的情况。简单地说,我想扩展宏FOO(x) 使得FOO(int) 将是shortFOO(anything_else) 将是long

使用 C++ 模板,这当然不是问题。但在这里我需要一个真正的令牌替换,而不仅仅是一个typedef。 IE。 FOO(char) FOO(char) i; 应该是等于long long i; 的有效定义。

【问题讨论】:

  • 最新的 C 标准具有宏的替换文本可以取决于第一个参数的表达式类型的功能。您可以将其用作构建块。
  • 你看过 boost.pp 吗?如果你能用它破解一些东西?
  • @StefanMajewsky:我相信你指的是泛型?

标签: c++ c c-preprocessor


【解决方案1】:

据我所知,C 宏中唯一可用的类似字符串的操作是粘贴/连接标记(使用##),以及对它们进行字符串化(使用#)。

我很确定您将获得的最接近的方法涉及列举如下可能性:

#define FOO(x) FOO__##x
#define FOO__int   short
#define FOO__short long
#define FOO__long  long
#define FOO__char  long
// ... for each type you want to replace

灵感来自this question

【讨论】:

  • (编辑#2):如果你有一组有限且已知的“其他”,可以将它们全部列出。
  • 是的,我刚刚意识到,并清理了整个帖子。
  • 我认为我无法预先列举我的论点;我可能会收到FOO(AcmeWidgetUnitTest17) :(
【解决方案2】:

你想做的事是不可能的。

宏由 c 预处理器评估,顾名思义,它在编译器运行之前运行。它还不知道你的符号是什么类型。

为什么不为在编译器评估时将自身转换为正确事物的类型创建一个类。

【讨论】:

  • 我不关心类型。我知道预处理阶段的int 只是一个令牌。不过,我想对令牌int 有条件地采取行动。
猜你喜欢
  • 2018-05-08
  • 1970-01-01
  • 2017-12-18
  • 2012-09-04
  • 2011-05-31
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多