[英]Weird C++ preprocessor macro syntax
我已將問題簡化為此代碼段-但這是較大程序的一部分,因此我不希望使用其他方法來執行此操作-我需要一種方法來完成此工作!
當我從此代碼生成預處理文件時:
#define OUTER(a, b) \
a##b
#define INNER(c, d) \
c##d
enum foo {
OUTER(INNER(x, y), z)
}; // line 108
int APIENTRY _tWinMain(...)
{
foo bar = xyz; // line 112
}
我得到:
enum foo {
xyz
}; // line 108
int __stdcall wWinMain(...)
{
foo bar = xyz; // line 112
}
這就是我想要的。 但是,如果嘗試編譯代碼,則會得到:
錯誤C2146:語法錯誤:標識符'z'第108行前缺少'}'
錯誤C2143:語法錯誤:缺少';' 在“}”行108之前
錯誤C2143:語法錯誤:缺少';' 在“}”行108之前
錯誤C2059:語法錯誤:“}”行108
錯誤C2065:“ xyz”:未聲明的標識符行112
我無法解決! 該問題似乎是由##
引起的:
#define OUTER(a, b) \
a##b
但是為什么(以及如何解決)超出我的范圍...
使用此代替:
#define CONCAT(X,Y) X##Y
#define OUTER(a, b) CONCAT(a,b)
#define INNER(a, b) CONCAT(a,b)
enum foo {
OUTER(INNER(x, y),z)
}; // line 108
int main(...)
{
foo bar = xyz; // line 112
}
用gcc
預處理示例會導致:
enum foo {
t.c:7:1: error: pasting ")" and "z" does not give a valid preprocessing token
xy z
};
這應該為您提供路德解決方案為何起作用而您的方案無效的線索。
如果使用的是gcc,則可以給它提供-E選項以查看預處理的輸出。 然后,您可以輕松查看預處理器輸出的內容以及如何進一步調試宏。 其他編譯器也有類似的選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.