uj2*_*uj2 48 visual-c++ c-preprocessor variadic-macros
考虑以下代码:
#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__
#define G(...) F(__VA_ARGS__)
F(1, 2, 3)
G(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
X = 1 and VA_ARGS = 2, 3两个宏的预期输出,这就是我用GCC得到的,但是,MSVC将其扩展为:
X = 1 and VA_ARGS = 2, 3
X = 1, 2, 3 and VA_ARGS =
Run Code Online (Sandbox Code Playgroud)
也就是说,__VA_ARGS__将其扩展为单个参数,而不是分解为多个参数.
有什么方法吗?
Ise*_*ria 47
MSVC的预处理器似乎与标准规范完全不同.
以下解决方法可能会有所帮助:
#define EXPAND( x ) x
#define F(x, ...) X = x and VA_ARGS = __VA_ARGS__
#define G(...) EXPAND( F(__VA_ARGS__) )
Run Code Online (Sandbox Code Playgroud)
小智 22
我发布了以下Microsoft支持问题:
以下程序提供编译错误,因为预编译器扩展
__VA_ARGS__错误:Run Code Online (Sandbox Code Playgroud)#include <stdio.h> #define A2(a1, a2) ((a1)+(a2)) #define A_VA(...) A2(__VA_ARGS__) int main(int argc, char *argv[]) { printf("%d\n", A_VA(1, 2)); return 0; }预处理器将printf扩展为:printf("%d \n",((1,2)+()));
而不是printf("%d \n",((1)+(2)));
我从Microsoft编译器团队开发人员那里得到了以下不满意的答案:
嗨:在这种情况下,Visual C++编译器的行为正常.如果组合规则,将与初始宏调用中的"..."匹配的标记组合在一起形成单个实体(16.3/p12),其规则是在参数替换之前扩展子宏(16.3.1/p1 )然后在这种情况下,编译器认为A2使用单个参数调用:因此错误消息.
| 归档时间: |
|
| 查看次数: |
14757 次 |
| 最近记录: |