【问题标题】:Visual Studio variadic macro expansion yields unexpected resultsVisual Studio 可变参数宏扩展产生意想不到的结果
【发布时间】:2016-10-13 19:04:30
【问题描述】:

目前我正在尝试使用 Visual Studio 2015 Service Pack 2 编译一些代码,该代码使用以下不是我编写的宏:

#define REM(...) __VA_ARGS__
#define EAT(...)

// Retrieve the type
#define TYPEOF(x) DETAIL_TYPEOF(DETAIL_TYPEOF_PROBE x,)
#define DETAIL_TYPEOF(...) DETAIL_TYPEOF_HEAD(__VA_ARGS__)
#define DETAIL_TYPEOF_HEAD( x , ... ) REM x
#define DETAIL_TYPEOF_PROBE(...) (__VA_ARGS__),
// Strip off the type
#define STRIP(x) EAT x
// Show the type without parenthesis
#define PAIR(x) REM x

假设 TYPEOF 宏将隔离表达式的类型。 我尝试通过以下调用调用 TYPEOF 宏:

TYPEOF( (int) m ) c;

理论上,结果应该是

int c;

而是预处理器输出

int, m, c;

更换

#define DETAIL_TYPEOF_HEAD(x, ...) REM x

#define DETAIL_TYPEOF_HEAD( x , ... ) X = x and VA_ARGS = __VA_ARGS__

产生这个输出:

X = (int), m, 和 VA_ARGS = c;

似乎在接收输入 (int) m 时,DETAIL_TYPEOF_HEAD 宏无法从可变参数列表中选择第一个条目 x,而是将整个列表放入 x。

你知道这种现象吗?

问候

【问题讨论】:

  • 我想我以前也遇到过这种现象。它被称为Microsoft 编译器
  • @n.m.我通常会将其标记为不具建设性,但在这种情况下,您可能是对的。 stackoverflow.com/questions/9183993/…
  • 我认为即使使用示例来解决此问题也超出了我的能力范围。你有什么想法吗?

标签: c++ visual-c++


【解决方案1】:

好的,我不知道具体如何,但这似乎给出了预期的结果:

// Retrieve the type
#define DETAIL_TYPEOF_HEAD_(x , ...) REM x
#define DETAIL_TYPEOF_HEAD( args ) DETAIL_TYPEOF_HEAD_ args
#define DETAIL_TYPEOF_PROBE(...) (__VA_ARGS__),
#define DETAIL_TYPEOF(...) DETAIL_TYPEOF_HEAD((__VA_ARGS__))
#define TYPEOF(x) DETAIL_TYPEOF(DETAIL_TYPEOF_PROBE x,)

添加括号似乎很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2016-06-20
    相关资源
    最近更新 更多