[英]Boolean in ifdef: is “#ifdef A && B” the same as “#if defined(A) && defined(B)”?
[英]Using #ifdef or #if defined() to find where a variable is (not) defined
我遇到一種情況,其中#ifdef
告訴我未定義某些內容,但是它會像定義它一樣繼續編譯一行。 我不知道怎么回事。
更廣泛的情況是,我將頭撞在磚牆上,試圖解決這個問題 。 我試圖確定在已編譯項目和未編譯項目中定義SERVICE_STATUS
的時間點。 就Visual Studio 2015而言,如果我右鍵單擊“ SERVICE_STATUS
”一詞並轉到其定義,則在兩種情況下,我都會進入同一文件:winsvc.h。 因此,我認為路徑不是問題。
所有這些使我在各個地方引入了以下五行檢查,以了解我是否可以理解在何處包含/定義了SERVICE_STATUS
:
#if defined(SERVICE_STATUS) // or #ifdef SERVICE_STATUS
#pragma message( "SS is defined" )
#else
#pragma message( "SS is NOT defined" )
#endif
在所有情況下,包括在編譯和非編譯情況下都使用SERVICE_STATUS
那一刻之前, 未定義唯一打印的消息是SS 。 這是不編譯的行,我可以通過在它之前引起故意的錯誤來證明它正在被解析:
static SERVICE_STATUS _serviceStatus;
我的頭撞得太多了嗎,以至於我在使用#ifdef
或#if defined()
明顯的男生錯誤(我都嘗試過)? 或者,如果未定義SERVICE_STATUS
,如何編譯?
這是發生這種情況的上下文的示意圖(在pocoproject.org的Poco發行版的serverserver.h文件中):
... // lots of irrelevant lines omitted...
[5LC] // apply my 5-line check
#include <ThisFile>
#include <ThatFile>
[5LC] // check again and find no change due to header inclusion
... // many more lines skipped...
[5LC] // one last check prior to using SERVICE_STATUS - still no change
static SERVICE_STATUS _serviceStatus; // variable results!?!?
如果您想獲得完整的上下文信息,請參閱我正在嘗試解決的問題,以獲取到一個壓縮項目的鏈接,在該項目中,我能夠獨立於我自己的項目來重現此問題...但是請單獨回答該問題。
SERVICE_STATUS
是使用typedef
定義的類型定義; 您其他問題的答案包含指向其文檔的鏈接。
#ifdef
僅用於確定是否使用#define
(或通過編譯器選項)將名稱定義為宏,您不能使用它來測試是否已定義類型,變量或函數。 它是預處理器的一部分,而不是編譯器的一部分,因此它對代碼的那些元素一無所知。
這兩個預處理器指令僅告訴您,是否將SERVICE_STATUS
定義為預處理器宏,即是否在#ifdef
之前某行顯示#define SERVICE_STATUS something
。 在非預處理器意義上,這與“定義”不同。
SERVICE_STATUS
是一個struct
,而不是一個宏(盡管存在令人誤解的可怕名稱)。 因此預處理器無法檢測到它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.