使用#define定義明示常量,例如:
#define two 2 //可以使用注釋
#define pi 3.1415923 //定義pi
#define seconds_per_year (60 * 60 * 24 * 365)ul //定義一年有多少秒(不考慮閏年)
上述巨集被稱為「類物件巨集」,其定義的語法如下:
#define pi 3.1415926
//預處理指令 巨集 替換體
注意:
類似定義一年有多少秒的巨集定義,預處理器將為我們計算常量表示式的值,因此我們可以(其實是最好)寫出計算過程,而不是寫出計算的結果的值。
另一方面,#define seconds_per_year (60 * 60 * 24 * 365)ul 將使16位機的整型數溢位,因此要用到長整型l;除此之外,這裡用無符號長整型(ul)更加合適。
在#define中使用引數可以建立外形和作用與函式類似的類函式巨集。其定義的語法如下:
#define mean(x,y) (((x)+(y))/2)
// 巨集 巨集引數 替換體
函式呼叫時將值傳遞給函式,巨集呼叫在編譯之前將引數記號傳遞給程式。由於傳遞的是記號,而不是值,所以在巨集定義的時候,要注意加括號,這樣遇到傳入引數是乙個表示式的時候才不會出現錯誤。
比如下面的例子:
#define square(x) x*x
這個巨集定義當呼叫square(x+2)的時候,顯然會出現錯誤。
所以使用帶引數的巨集定義的時候,一定要注意引數的括號。下面是常用的求兩個數較小的那個數的巨集定義。使用這個巨集定義的時候,需要注意當傳入引數帶有自增或者自減運算子的時候,用?:這樣的三目運算子會造意想不到的結果。
#define min(x,y) ((x)<=(y)?(x):(y))
比如:
int least=min((*p)++,a);
如果程式的本意得到(*p)++與a中較小的那個值,但是如果(*p)++<=a,那麼三目運算子返回(*p)++,此時會改變(*p)的值。而如果傳入(++(*p)),則最後會導致least的值也不正確。 C 語言的預處理器指令
c 語言的預處理器指令 一 if if 使您可以開始條件指令,測試乙個或多個符號以檢視它們是否計算為 true。如果它們的計算結果確實為 true,則編譯器將計算位於 if 與最近的 endif 指令之間的所有 以 if 指令開始的條件指令必須用 endif 指令顯式終止。例如 define deb...
C 預處理器指令
c 預處理器指令是在編譯時呼叫的。預處理器指令 preprocessor directive 告訴c 編譯器要編譯哪些 並指出如何處理特定的錯誤和警告。c 預處理器指令還可以告訴c 編輯器有關 組織的資訊。1.定義符號和取消符號定義的預處理指令 define 和 undef 預處理指令都以 號開頭並...
C 預處理器指令
預處理器指令從來不會轉化為可執行 中的命令,但會影響編譯過程中的各個方面。實際應用如 計畫發布二個版本的 即基本版本和擁有更多功能的企業版本,就可以使用這些預處理器指令 另外在編寫提供除錯資訊的 時,也可以使用預處理器指令。下面介紹幾個常用到的預處理器指令 define 和 undef 用法如 de...