簡體   English   中英

C ++預處理器不按預期處理定義

[英]C++ Preprocessor doesn't process define as expected

我遇到了cpp預處理器的問題。 我有這樣的Input.h文件:

#ifndef PLATFORM_MOBILE1111
    #define MyTest WEB111
#endif 

int MyTest;

我用這個命令處理它(在OSX上):

cpp -E -P Source/Input.h Generated/Output.h

我明白了:

    #define MyTest WEB111


int MyTest;

宏MyTest未被應用。 為什么?


經過一系列的實驗,我發現如果我在#ifndef行之后插入一個空行,變量定義,注釋或任何其他行 - 那么它工作正常。

#ifndef PLATFORM_MOBILE1111

    #define MyTest WEB111
#endif 

int MyTest;

所以上面的輸入被正確處理成:

int WEB111;

有人可以向我解釋為什么會這樣嗎? 以及如何解決? 有沒有我可以通過的選項?


編輯:我還發現##(連接運算符)也不起作用!

奇怪! 您清楚地發現了clang預處理器中的錯誤!

我也可以在OSX上重現這一點( Apple LLVM version 8.1.0 (clang-802.0.42) )。

當你在#define (縮進)之前刪除空格時,這也會按預期開始工作,但前導空格根本不重要,很多編輯器在#ifdefs縮進#defines

關於正在發生的事情的一個暗示是,在偽造版本中,# #define仍然存在於已處理的源代碼中,而在正確的版本中則不存在。 顯然,預處理器根本不認識#define

即使這樣也失敗了(注意領先的空間):

 #define MyTest WEB111
int MyTest;

雖然這按預期工作:

#define MyTest WEB111
int MyTest;

這導致WEB222:

 #define MyTest WEB111
 #define MyTest WEB222
int MyTest;

這導致WEB111:

#define MyTest WEB111
 #define MyTest WEB222
int MyTest;

瘋了!1! :-)

似乎總是第一個縮進的#define被忽略。

現在'解決方案':使用:

gcc -E Source/Input.cpp -P -o Generated/Output.cpp

這可以按預期工作,盡管它使用相同的LLVM。

所以我假設gcc可執行文件以不同於cpp初始化預處理器。 這仍然是cpp一個錯誤。

我發現通過c++而不是cpp運行預處理器可以解決我的兩個問題:

c++ -E -P Source/Input.h Generated/Output.h

順便說一句:如果你的文件沒有使用c++命令的常規c / c ++擴展,你需要添加-x c++標志。 沒有這個, cpp工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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