2013-04-10 63 views
1

當我宣佈類似#define指令存儲器

#define VAR 1 

,其中將1個值儲存在哪裏?我不認爲在堆中,也不在堆棧中。是否可以在.bss部分?

+0

INT測試非常有用= VAR;和int test = 1;是相同的。預處理器不存儲任何內容。 – Etherealone 2013-04-10 20:04:53

+6

它根本沒有儲存。預處理器只進行文本替換,即用文本「1」代替文本「VAR」的每一次出現。 – cnicutar 2013-04-10 20:05:02

回答

9

它不存儲在任何地方。它僅在編譯的預處理階段使用。你可以把它看作是VAR的一個文本替換,在你的代碼中使用1。完成此操作後,該宏本身不再存在於您的程序中。

考慮下面的例子:

#define VAR 1 
int x = VAR; 

這是簡單地預處理成:

int x = 1; 

它是那麼這個代碼被編譯爲C++。所以宏觀VAR根本沒有佔用任何空間。但是,由x定義的對象可能會非常好。

2

它存儲在無論你實際使用VAR,因爲你在這裏定義的所有是預處理器的文本替換規則。

#define VAR 1 
int x = VAR; 

源編譯之前,預處理器將在減少:

int x = 1; 

在這種情況下,1值存儲在x。在編譯之前,VAR符號被有效擦除。

3

#define純粹是一種預處理製品。如果宏未被使用,它的值甚至不會到達編譯器。如果它使用,那麼您的問題的答案將取決於它如何使用

1

它只是#define VAR 1。所以只有...定義。它不會導致任何內存分配,它只能被預處理器用來修復所有具有定義值1的VAR的出現。只是一個文本概念。

1

編譯器將在程序中使用的所有#define變量替換值,而目標代碼正在生成。

1

如果您使用的是gcc,可以使用選項-E。有了這個選項,你可以看到執行#define語句的替代源代碼的輸出(也#包括等)

gcc -E whatever_file.c 

在調試複雜的宏