如何處理C中的定義?它們是按行號順序處理的嗎?可以#define包含以前定義的變量嗎?
例如,以下說法是否有效?
#define ONE 1
#define TWO (ONE+1)
根據以前的定義,定義會有問題嗎?
如何處理C中的定義?它們是按行號順序處理的嗎?可以#define包含以前定義的變量嗎?
例如,以下說法是否有效?
#define ONE 1
#define TWO (ONE+1)
根據以前的定義,定義會有問題嗎?
是的,一個#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
};
正在使用的時候他們在點處理,因此你的例子,甚至這
#define TWO (ONE+1)
#define ONE 1
將工作。
的最佳方式是自行檢查:
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;
}
編譯器處理在他們去...罰款的順序#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
我個人更喜歡前一種方法優於後者:它是預處理器顯然更容易處理。
爲什麼不自己嘗試一下呢? – Cyclonecode 2015-01-26 17:54:58
你是對的。我應該先嚐試一下自己。 – Aman 2015-01-26 17:58:16
你還應該讓它把每個參數放在它自己的括號裏,例如這裏:'((ONE)+1)'。 – 2015-01-26 18:00:21