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