2015-01-26 91 views
3

如何處理C中的定義?它們是按行號順序處理的嗎?可以#define包含以前定義的變量嗎?

例如,以下說法是否有效?

#define ONE 1 
#define TWO (ONE+1) 

根據以前的定義,定義會有問題嗎?

+3

爲什麼不自己嘗試一下呢? – Cyclonecode 2015-01-26 17:54:58

+0

你是對的。我應該先嚐試一下自己。 – Aman 2015-01-26 17:58:16

+1

你還應該讓它把每個參數放在它自己的括號裏,例如這裏:'((ONE)+1)'。 – 2015-01-26 18:00:21

回答

4

是的,一個#define可以參考其他#define替換和宏沒有任何問題。

而且,這些常量上的表達式仍然是一個常量表達式。

您的第二個表達式在文本中與文本上的(ONE+1)替換相同,對嵌套層次沒有限制。換句話說,如果以後定義

#define THREE (TWO+1) 

,然後在分配i = THREE使用它,你將預處理後得到

i = ((ONE+1)+1) 

如果您計劃使用這一招用數值,常見的替代方法是使用一個enum與特定的值,即

enum { 
    ONE = 1 
, TWO = ONE+1 
, THREE = TWO+1 
, ... // and so on 
}; 
4

正在使用的時候他們在點處理,因此你的例子,甚至這

#define TWO (ONE+1) 
#define ONE 1 

將工作。

2

的最佳方式是自行檢查:

g++ test.cpp 
gcc test.c 

對於嚴格的編譯器檢查:

gcc test.c -pedantic 

和所有爲我工作!

test.c的/ TEST.CPP

#include <stdio.h> 

#define A 9 
#define B A 

int main() 
{ 
    printf("%d\n",B); 
    return 0; 
} 
0

編譯器處理在他們去...罰款的順序#define -s。在每個#define獲得處理後,預處理器將繼續處理此#define之後的所有文本,並在此#define所留下的狀態下使用它。所以,在你的榜樣:

#define ONE 1 
#define TWO (ONE+1) 

它首先處理#define ONE 1,與1取代的ONE所有進一步occurunces。因此,第二個宏變爲

#define TWO (1+1) 

這就是預處理器如何處理和應用它。

反向例如:

#define TWO (ONE+1) 
#define ONE 1 

也將起作用。爲什麼?那麼,預處理器將採取第一個#define,掃描代碼TWO的任何出現,並用(ONE+1)代替它。然後到達第二#define,並取代的ONE所有出現,包括那些以前#define到位,以1

我個人更喜歡前一種方法優於後者:它是預處理器顯然更容易處理。

相關問題