簡體   English   中英

奇怪的C ++預處理程序宏語法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM