C語言 預處理

2021-09-11 02:52:35 字數 1934 閱讀 6900

在預處理階段,主要完成:巨集定義替換,標頭檔案包含,條件編譯,和其他(#等特殊運算子)。

巨集定義替換:

#define 定義的巨集,只能在一行內表達(換行符表示結束而非空格),如果想多行表達,則需要加續行符(\)

1、巨集常量:

常被 const/ enum 變數取代,一般用於定義檔案路徑。

#define filepath "e:\\english\\writing\\artile"    //定義檔案路徑,注意加轉義字元(\)

//巨集出錯處理函式

#define err_exit(m)\ //多行定義時加續行符

do\while(0)

2、巨集型別

巨集可以給型別起別名,但存在缺點容易出錯,常被 typedef 取代。

#define charp char *

int main(void)

3、巨集函式

常將短小精悍的函式進行巨集化,這樣可以嵌入到**中,減少呼叫的開銷。代價就是編譯出的檔案可能會變大。

//常見巨集函式,注意一點:多加括號,防止出錯

#define max(a,b) (a>b)?a:b

條件編譯:依據給定條件,判斷哪些程式段參與編譯。

單雙路 (#ifdef / #ifndef   #else   #endif)

單雙多路 (#if   #elif   #endif)

標頭檔案包含:

1、包含的方式:         

系統標頭檔案,使用 <>          自定義標頭檔案,使用 「 」

#include從系統指定路徑中搜尋包含標頭檔案   

#include「mystring.h」    優先從工程當前路徑中搜尋包含標頭檔案,如果當前路徑沒找到,則到系統路徑下搜尋。

2、定義標頭檔案:固定套路,防止標頭檔案重複包含

#ifndef __xx_h__

#define __xx_h__

//資料型別宣告

//函式宣告

#endif

3、多檔案程式設計:

一方面,方便管理和維護,可以協同開發。另一方面,便於分享與加密(作成函式庫)。

其它:

1、# 運算子      利用巨集建立字串

可以將替換符->字串化,解決字串中內容不可被替換的問題。

#include #define str(x) "aaaa"#x"cccc"

int main()

2、## 運算子    預處理的粘和劑

解決了,引數變數與巨集展開,無法一一對應的問題。

#define xname(n) x##n

#define print_xn(n) printf("x"#n" = %d\n", x##n)

int main()

綜上:#解決了雙引號中無法替換問題,##解決了非雙引號中粘連無法替換的問題。

3、預定義巨集

__date__   進行預處理的日期(「mm dd yyyy」形式的字串文字)

__file__     代表當前源**檔名的字串文字

__line__    代表當前源**中的行號的整數常量

__time__    原始檔編譯時間,格式「hh:mm:ss」

C語言預處理

c語言中編譯預處理的三種形式的命令 巨集定義,檔案包含,條件編譯命令。1 巨集定義主要是 define,undef 如下 define pi 3.1415926 不帶引數的巨集定義 define max a,b a b?a b 帶引數的巨集定義 說明 巨集定義在c語言與c 語言中是相通的。下面舉例說...

C語言預處理

預處理 系統自動自動呼叫預處理程式對程式中 號開頭的預處理部分進行處理,處理完畢後可以進城源程式的編譯階段。預定義 一些預定義符號 常用於除錯 file 正在預編譯的源檔名 line 當前行號 只有這個是整數常量,其他是字串常量 function 當前所在函式名 date 當前日期 time 當前時...

c語言預處理

預處理可以包含 1 巨集定義指令 2 標頭檔案包括指令 3 條件編譯指令 4 編譯程式可以識別的特殊符號 巨集定義 define undef 檔案包含 include 條件編譯 if ifdef else elif endif等 其他 line error program等 注意事項 1 在c語言中...