Visual Studio可变宏展开会产生意想不到的结果

Visual Studio variadic macro expansion yields unexpected results

本文关键字:意想不到 结果 Studio Visual      更新时间:2023-10-16

目前我正试图用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, and VA_ARGS = c;

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

你知道这个现象吗?

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

// 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,)

添加括号似乎很有帮助。