作者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://www.ptt.cc/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
推 LPH66: , ##__VA_ARGS__ ←這東西在 __VA_ARGS__ 為空時吃掉逗號 10/24 18:20
→ LPH66: 這件事是 gnu extension 10/24 18:21
→ LPH66: 注意這只有在 ## 前面是逗號後面是 __VA_ARGS__ 才算數 10/24 18:23
→ LPH66: 如果你只是想解決這個, 可以參考下面的第二個回答 10/24 18:34
→ LPH66: 他的解法雖然有上限但至少那是你可以擴充的 10/24 18:34
→ LPH66: 不加 ## 的 __VA_ARGS__ 基本上應該要沒什麼問題 10/24 18:36
→ LPH66: 開頭的問題個人認為是 VC 的 bug, 但現在一下子找不到資料 10/24 18:37
→ LPH66: 啊, 才剛說就找到了: 10/24 18:39
→ LPH66: VC 認為 __VA_ARGS__ 展開的東西會變成一團所以如此 10/24 18:40
→ LPH66: 要騙過它加一層什麼都不改的 macro 即可 10/24 18:40
→ LPH66: 例如使用回答中的 EXPAND, 然後把 FOO_ 改成 10/24 18:43
→ LPH66: #define FOO_(N,...) EXPAND( FOO_##N (__VA_ARGS__) ) 10/24 18:43
→ dreamboat66: 謝謝你 我看一下, 不過意思是有需要##__VA_ARGS__ 10/24 21:25
→ dreamboat66: 來去除comma的做法 除了gcc配extension外其他不好做? 10/24 21:25
→ dreamboat66: 另外想藉此問一下 印int64_t 有沒有可攜的寫法? 10/24 22:50
→ dreamboat66: 我x86用 lld, x64要寫ld, 不知道怎辦... 10/24 22:51
→ dreamboat66: '%I64d' 這寫法好像又不是可攜的? 10/24 22:51
推 LiloHuang: int64_t 可用 PRId64,要記得 #include <inttypes.h> 10/24 22:54
推 LPH66: 嗯, PRId64 即可, 注意它是 macro 名不能包在字串當中 10/25 02:55
→ LPH66: 例如 printf("[" PRId64 "]", i64var); 10/25 02:56