如果想在下一行延續指令,則在當前行末尾使用\字元
帶引數的巨集
#define max(x,y) ((x)>(y)?(x):(y))
#define is_even(n) ((n)%2==0)
則
i=max(j+k,m-n);
if(is_even(i)) i++;
將被替換為
i=((j+k)>(m-n)?(j+k):(m-n));
if((i)%2==0) i++;
巨集的替換列表可以包含對其他巨集當呼叫,如:
#define pi 3.14
#define twopi (2*pi)
則twopi
為2*pi,
也就是2×3.14,6.28
可以用#undef
來取消定義,
#undef
識別符號
建立較長的的巨集
使用逗號運算子
#defineecho (s)
(gets(s
),puts(s
)) 則echo (str);
替換為(
gets
(str
),puts
(str));
預定義巨集
__line__
被編譯檔案中的行號
__file__
被編譯的檔名
__data__
編譯的日期
__time__
編譯的時間
__stdc__
如果編譯器符合
c標準(
c99,c89)
,那麼值為1
printf("compiledon %s at %s\n",__date__,__time__);
檢查被0
除而導致的錯誤
#definecheck_zero(divisor) \
if(divisor==0) \
printf("**attempt to divide by zero on line%d " \
"of file %s **\n",__line__,__file__)
int main()
__func__
識別符號#definefunction_called() printf(「%scalled\n」,__func__)
//若函式
f呼叫,則輸出
f called
#if指令和
#endif
指令#definedebug 1
…#if debug
printf(...);
#endif
可以通過修改
debug
所定義的值來決定
#if與
#endif
之間的**是否執行,如果值不為
0,則執行
#defined
指令僅檢測某個巨集是否有定義,有則返回
1,無則返回
0,常與
#if結合使用:
#ifdefined(debug)
…#endif
不一定需要給巨集賦值,如下例的
debug
,#define debug
#ifdef
指令和#ifndef
指令#ifdef
等價與#if defined
,所以嚴格來說並不需要此指令
#elif
指令和#else
指令#if
、#ifdef
、#ifndef
可以像普通的
if語句那樣巢狀使用。
在#if
和#endif
之間可以有多個
#elif
,但只能有乙個
#else
使用條件編譯
#ifdefined(win32)
…#elifdefined(mac_os)
…#elifdefined(linux)
…#endif
#if__stdc__
函式原型
#else
老式的函式宣告
#endif
#ifndefbuffer
#definebuffer 256
#endif
不能用/**/
注釋直接注釋掉已經包含
/**/
的**#error
如果預處理器遇到
#error
指令,會顯示一條包含訊息的出錯訊息,有些編譯器會立即終止編譯而不再檢查其他錯誤。
例如需要確保乙個程式無法在一台
int型別不能儲存
100 000
的機器上編譯:
#if int_max< 100000
#errorint type is too small //#error
後面的為訊息
#endif
#line
#pragma
對非常大的程式或需要使用特定編譯器的特殊功能的程式非常有用
_pragma
運算子可以使用
#單獨佔一行,作為空指令,增加間隔
C語言 預處理器
指令 描述 define 定義巨集 macro include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else if 的替代方案 endif 結束乙個if.else條件編譯塊...
C語言 預處理器
6 gcc編譯器檢視替換後的編碼 7 標頭檔案相互包含導致的重定義錯誤 指令 描述 define 定義巨集 include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else i...
C語言 預處理器
3 條件編譯 4 檔案包含include 5 其他指令 預處理階段會執行這些指令。file 進行編譯的源檔名 line 檔案當前的行號 date 檔案被編譯的日期 time 檔案被編譯的時間 define suqre x x x 如果乙個現存的名字需要重新定義,那麼舊的定義首先必須要用 undef ...