2016-07-06 314 views
0

#define的作用域是什麼?#define的範圍是什麼?

我有一個關於#define for C/C++的範圍的問題,我試着去了解預處理器。

假設我有一個包含多個源文件和頭文件的項目。比方說,我有一個具有以下的頭文件:

// header_file.h 

#ifndef __HEADER_FILE 
#define __HEADER_FILE 

#define CONSTANT_1   1 
#define CONSTANT_2   2 

#endif 

讓我們那麼說,我有被按以下順序編譯兩個源文件:

// source1.c 

#include header_file.h 

void funct1(void) 
{ 
    int var = CONSTANT_1; 
} 


// source2.c  

#include header_file.h 

void funct2(void) 
{ 
    int var = CONSTANT_2; 
} 

假設我已經包括所有其他必要開銷,這段代碼應該編譯好。不過,我很好奇在編譯過程中記住了什麼#defines。當我編譯上面的代碼時,實際包含了每個#include的內容,還是實際實現的包含警衛?

TLDR:是否將#define從一個編譯單元轉移到另一個編譯單元?或者#define只存在於一個編譯單元中?

當我輸入這個,我相信我回答我自己的問題,我會說出我相信的答案。 #define被限制爲一個編譯單元(.c)。預處理器在從一個編譯單元轉到下一個編譯單元時基本上會忘記任何#define。因此,在我列出的上述例子中,包含衛兵不會發揮作用。我在這個信念中糾正了嗎?

+6

TL/DR:'#define'在每個編譯單元中從它向下定義的點直到'#undef'-ed都是可見的。 –

+0

[C中#define預處理器的作用域]的可能重複(http://stackoverflow.com/questions/6379489/scope-of-define-preprocessor-in-c) –

回答

2

source1.c與source2.c分開編譯,因此您的定義將在編譯時針對source1進行處理,然後作爲獨立操作在編譯時針對source2進行處理。

希望這是一個明確的解釋。

0

是的,你是對的!編譯自己的文件只不過是一個正在執行的過程。一個進程不能與另一個進行交易,除非明確完成。 c預處理器只是文字替換機制,以愚蠢的方式執行。無論執行什麼條件檢查,都僅限於正在進行的預處理器實例,一旦執行(編譯)結束,沒有任何結果。預處理器不會「配置」編譯器,它們的範圍是有限的,直到「他們自己的編譯」

1

預處理器宏沒有這樣的「範圍」,它們只是定義一段文本,應該替代代碼中的宏。

這意味着,編譯器不會看到字符串CONSTANT_1CONSTANT_2而是獲取源與這些宏的擴展(12分別)取代了預處理形式。

您可以通過調用gcc-E標誌來檢查此預處理源,或者使用任何標誌只對您的特定編譯器進行預處理。