2017-04-21 43 views
0

如果我定義一個宏象下面這樣:C編譯器如何存儲宏變量?

#define TEST_VARIABLE 10 

編譯器如何儲存在內部?作爲一個有符號/無符號整數?

我有一個循環,我的程序:

for (unsigned int loop = 0; loop < TEST_VARIABLE; loop++) 

我要檢查,如果額外的指令是由編譯器添加,同時與TEST_VARIABLE比較類型轉換「循環」變量。如果TEST_VARIABLE存儲在不同的數據類型中,則需要額外的指令。

+3

它不存儲它。它實際上是一個簡單的複製'n'粘貼,所以編譯器會將你的for循環轉換爲for(unsigned int loop = 0; loop <10; loop ++)'。 FYI,文字'10'的類型將是'int'。 – Cornstalks

+2

編譯器本身並不知道預處理器。它在編譯發生之前運行。它只是看到'10',它是一個有符號的整數值。如果您的警告足夠高,您應該看到有關將有符號值與無符號值進行比較的警告。你可以重寫你的字面值爲'10U'來使它無符號。 –

+1

一個宏不是一個變量,編譯器從來沒有看到它 –

回答

3

當預處理器執行宏替換時,它將其視爲文本。在宏處理期間,替換看起來像一個數字的事實是完全不相關的。當編譯器處理結果時,就好像你在其位置上輸入了替換。所以

for (unsigned int loop = 0; loop < TEST_VARIABLE; loop++) 

被同等對待,以

for (unsigned int loop = 0; loop < 10; loop++) 

編譯器將解釋10signed int

+0

s/text /一個令牌流/,至少對於一致的預處理器。 (我知道,這是徒手,但考慮'循環 rici

0

#define創建的宏基本上是文本替換,並由預處理程序處理。然後將預處理器的結果交給編譯器。

所以當預處理與您的代碼完成,其結果是:

for (unsigned int loop = 0; loop < 10; loop++) 

然後編譯器讀取和編譯的代碼。所以在這種情況下,你有一個數字常量。此常數的類型爲int,因爲沒有類型後綴或轉換。