a.cpp文件里有个宏
#define debug(x) printf##x
在程序里调用,还是很方便的,
debug(("WndProc->hWnd:%d\n", hWnd));
上面这个宏在VisualStudio里没报错,
但改为g++编译器,在cmake里就报错了
error: pasting "printf" and "(" does not give a valid preprocessing token
#define debug(x) printf##x
^
这个宏的意思是将输入内容x与printf拼接起来,
实际调用是,x 相当于 ("WndProc->hWnd:%d\n", hWnd)
也就是说,连括号一起传值,但g++不干了,
msvc里面的cl.exe没报错,
你这种用法本身就不是一种标准化的用法,需要依赖编译器的支持,建议你不要这么用。
用不定参数的宏就可以实现你的需求,还不需要双重括号。