作者dreamboat66 (小嫩)
看板C_and_CPP
标题[问题] MACRO 展开遇到不可携的问题
时间Sat Oct 24 18:02:08 2015
遇到一个g++ 可以成功编译 , 但摆在VC (vs2015) 却无法编译成功
问题如下
http://ideone.com/TJW1ri
有把预期的结果标注再注解上
但VC 的compile error却是
'std::pair<_Unrefwrap<_Ty>::type,_Unrefwrap<_Ty2>::type> std::make_pair(_Ty1
&&,_Ty2 &&)': expects 2 arguments - 3 provided
我看他vc的preprocess过的结果是
Foo(std::make_pair(a, b, "a, b"), std::make_pair(, ));
我不太理解他为啥会这样产出结果, 有能力把这段code变的可携吗?
另外询问一下
c++是不是variadic macro: __VA_ARGS__ 不是标准 所以尽量不要使用?
因为我一直遇到 必须要用#
#__VA_ARGS__ 可是compile出问题...
VC可以, g++要是标上-std=c++XX 就会出错
例如
http://coliru.stacked-crooked.com/a/a314e9c3ac9e02e5
用ideone无法知道他怎麽下command的 他会对....
这麽简单的case也会出问题 是不是也无法写出可携的程式在这情况下呢?
两个问题 烦请各位解惑
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.218.186.168
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1445680934.A.58E.html
※ 编辑: dreamboat66 (180.218.186.168), 10/24/2015 18:05:28
※ 编辑: dreamboat66 (180.218.186.168), 10/24/2015 18:19:34
1F:推 LPH66: , ##__VA_ARGS__ ←这东西在 __VA_ARGS__ 为空时吃掉逗号 10/24 18:20
2F:→ LPH66: 这件事是 gnu extension 10/24 18:21
3F:→ LPH66: 注意这只有在 ## 前面是逗号後面是 __VA_ARGS__ 才算数 10/24 18:23
4F:→ LPH66: 如果你只是想解决这个, 可以参考下面的第二个回答 10/24 18:34
6F:→ LPH66: 他的解法虽然有上限但至少那是你可以扩充的 10/24 18:34
7F:→ LPH66: 不加 ## 的 __VA_ARGS__ 基本上应该要没什麽问题 10/24 18:36
8F:→ LPH66: 开头的问题个人认为是 VC 的 bug, 但现在一下子找不到资料 10/24 18:37
9F:→ LPH66: 啊, 才刚说就找到了: 10/24 18:39
11F:→ LPH66: VC 认为 __VA_ARGS__ 展开的东西会变成一团所以如此 10/24 18:40
12F:→ LPH66: 要骗过它加一层什麽都不改的 macro 即可 10/24 18:40
13F:→ LPH66: 例如使用回答中的 EXPAND, 然後把 FOO_ 改成 10/24 18:43
14F:→ LPH66: #define FOO_(N,...) EXPAND( FOO_##N (__VA_ARGS__) ) 10/24 18:43
15F:→ dreamboat66: 谢谢你 我看一下, 不过意思是有需要##__VA_ARGS__ 10/24 21:25
16F:→ dreamboat66: 来去除comma的做法 除了gcc配extension外其他不好做? 10/24 21:25
17F:→ dreamboat66: 另外想藉此问一下 印int64_t 有没有可携的写法? 10/24 22:50
18F:→ dreamboat66: 我x86用 lld, x64要写ld, 不知道怎办... 10/24 22:51
19F:→ dreamboat66: '%I64d' 这写法好像又不是可携的? 10/24 22:51
20F:推 LiloHuang: int64_t 可用 PRId64,要记得 #include <inttypes.h> 10/24 22:54
21F:推 LPH66: 嗯, PRId64 即可, 注意它是 macro 名不能包在字串当中 10/25 02:55
22F:→ LPH66: 例如 printf("[" PRId64 "]", i64var); 10/25 02:56