簡體   English   中英

使用#ifdef或#if define()查找(未)定義變量的位置

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

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