Visual Studio可变参数宏扩展会产生意外结果

时间:2016-10-13 19:04:30

标签: c++ visual-c++

目前我正在尝试使用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。

你知道这个现象吗?

问候

1 个答案:

答案 0 :(得分:0)

好的,我不知道究竟是多少,但这似乎给出了预期的结果:

B7 = B7+Bi

添加括号似乎有很大帮助。