[問題] MACRO 展開遇到不可攜的問題

看板C_and_CPP (C/C++)作者 (小嫩)時間10年前 (2015/10/24 18:02), 10年前編輯推噓3(3019)
留言22則, 3人參與, 最新討論串1/1
遇到一個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

10/24 18:20, , 1F
, ##__VA_ARGS__ ←這東西在 __VA_ARGS__ 為空時吃掉逗號
10/24 18:20, 1F

10/24 18:21, , 2F
這件事是 gnu extension
10/24 18:21, 2F

10/24 18:23, , 3F
注意這只有在 ## 前面是逗號後面是 __VA_ARGS__ 才算數
10/24 18:23, 3F

10/24 18:34, , 4F
如果你只是想解決這個, 可以參考下面的第二個回答
10/24 18:34, 4F

10/24 18:34, , 5F

10/24 18:34, , 6F
他的解法雖然有上限但至少那是你可以擴充的
10/24 18:34, 6F

10/24 18:36, , 7F
不加 ## 的 __VA_ARGS__ 基本上應該要沒什麼問題
10/24 18:36, 7F

10/24 18:37, , 8F
開頭的問題個人認為是 VC 的 bug, 但現在一下子找不到資料
10/24 18:37, 8F

10/24 18:39, , 9F
啊, 才剛說就找到了:
10/24 18:39, 9F

10/24 18:39, , 10F

10/24 18:40, , 11F
VC 認為 __VA_ARGS__ 展開的東西會變成一團所以如此
10/24 18:40, 11F

10/24 18:40, , 12F
要騙過它加一層什麼都不改的 macro 即可
10/24 18:40, 12F

10/24 18:43, , 13F
例如使用回答中的 EXPAND, 然後把 FOO_ 改成
10/24 18:43, 13F

10/24 18:43, , 14F
#define FOO_(N,...) EXPAND( FOO_##N (__VA_ARGS__) )
10/24 18:43, 14F

10/24 21:25, , 15F
謝謝你 我看一下, 不過意思是有需要##__VA_ARGS__
10/24 21:25, 15F

10/24 21:25, , 16F
來去除comma的做法 除了gcc配extension外其他不好做?
10/24 21:25, 16F

10/24 22:50, , 17F
另外想藉此問一下 印int64_t 有沒有可攜的寫法?
10/24 22:50, 17F

10/24 22:51, , 18F
我x86用 lld, x64要寫ld, 不知道怎辦...
10/24 22:51, 18F

10/24 22:51, , 19F
'%I64d' 這寫法好像又不是可攜的?
10/24 22:51, 19F

10/24 22:54, , 20F
int64_t 可用 PRId64,要記得 #include <inttypes.h>
10/24 22:54, 20F

10/25 02:55, , 21F
嗯, PRId64 即可, 注意它是 macro 名不能包在字串當中
10/25 02:55, 21F

10/25 02:56, , 22F
例如 printf("[" PRId64 "]", i64var);
10/25 02:56, 22F
文章代碼(AID): #1MArScME (C_and_CPP)
文章代碼(AID): #1MArScME (C_and_CPP)