2016-12-16 64 views
0

#define TML_ID - 沒有值分配給TML_ID。編譯或構建可執行文件沒有問題。這是否會將任何默認值(如null)分配給TML_ID或將TML_ID視爲未定義?如果#define在沒有賦值的情況下使用,它會做什麼?

+0

你怎麼知道它沒有價值?那麼空串呢? – e0k

+3

[C重複](http://stackoverflow.com/questions/13892191/empty-macro-definition-in-c),在C + +中相同的答案。 – juanchopanza

回答

4

這只是說,宏定義,這樣你就可以做到這一點在main或任何其他功能:

#ifdef TML_ID 
printf("Defined!\n"); 
#else 
printf("Undefined!\n"); 
#endif 
+0

'#endif'(不得不) – qxz

+0

@qxz,是的,我忘記了,謝謝指出。現在編輯。 – ForceBru

+0

謝謝。是的,即使沒有賦值,也會被視爲已定義。 – JSRK

0

#define不分配一個值宏。實際上,它被認爲是一個標誌,告訴編譯器已經定義了一個特定的宏。

您可以想象,如果您聲明一個變量而不指定任何值。它會有一個垃圾值,但它會在內存中保留一個空間。但是如果是宏,定義將不會保留空間。只有編譯器的提示。

+0

感謝您的解釋。 – JSRK

+0

沒有任何替換文本的宏沒有垃圾值。 –

+0

@PeteBecker這是正確的,這就是爲什麼我使用術語「標誌」。這也是一個沒有定義的宏和一個未使用的變量之間的區別。 – Sam

0

沒有分配一個值,以這種方式的宏通常用於防止包括相同h文件多次,這樣:

#ifndef _FILENAME 
#define _FILENAME 

//declaration code 

#endif 

如果某些cpp文件包括,例如,兩個不同的.h文件,它們都包含我們的.h文件,那麼.cpp將只有一個聲明代碼副本,因爲第二次_FILENAME宏將被定義,並且聲明代碼將被跳過。

+0

以下劃線開頭並以大寫字母('_FILENAME')開頭的名稱和包含兩個連續下劃線的名稱保留供實施使用。不要在你的代碼中使用它們。 –

0
#define MACRO 

定義了一個名爲MACRO的宏。它沒有內容,所以如果你寫了類似std::cout << MACRO的東西,你會得到一個錯誤,因爲那裏什麼都沒有。這通常用於有條件地使用新的關鍵字:

#if CPP_VERSION_C11 
    #define NOEXCEPT noexcept 
#else 
    #define NOEXCEPT 
#endif 

void f() NOEXCEPT { 
    // whatever 
} 

還有兩種其他方式可以使用這樣的宏。您可以檢查它是否是定義:

#ifdef MACRO 
    // code for one branch 
#else 
    // code for other branch 
#endif 

對於代碼,因爲MACRO已定義,預處理器將着眼於在第一分支代碼,並跳過代碼在第二分支。如果MACRO尚未定義,它將跳過第一個分支中的代碼而不是第二個分支中的代碼。你也可以做同樣的事情是這樣的:

#if defined(MACRO) 

,或者你可以在預處理器指令使用的常量表達式:

#if MACRO 
    // code for one branch 
#else 
    // code for other branch 
#endif 

這裏,MACRO得到值0,則#if看到值0,並且預處理器跳過第一個分支。同樣的事情發生在更復雜的表達式:

#if MACRO + 1 > 0 
    // code for one branch 
#else 
    // code for other branch 
#endif 

這裏,MACRO的值爲0,MACRO + 1具有值1,並且第一分支將被選擇。

相關問題