C語言 預處理器

2021-06-04 13:34:36 字數 2731 閱讀 9978

如果想在下一行延續指令,則在當前行末尾使用\字元

帶引數的巨集

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