C語言 預處理器指令( define)

2021-10-05 19:47:58 字數 1148 閱讀 7875

使用#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...