在預處理階段,主要完成:巨集定義替換,標頭檔案包含,條件編譯,和其他(#等特殊運算子)。
巨集定義替換:
#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語言中...