C預(yù)處理器
C預(yù)處理器處理程序的源代碼,在編譯之前運行输虱,通常以符號#
開頭,C語言的預(yù)處理主要有3個方面的內(nèi)容(下三)
1. 宏定義和宏替換 #define
"宏"是借用匯編語言中的概念壳快,為了是方便作一些定義和擴展
以#define
開頭燕侠,分為
- (1) 符號常量的宏定義
- (2) 帶參數(shù)的宏定義
1.1 符號常量的宏定義:#define 標(biāo)識符 字符串
注:其中標(biāo)識符就是宏名稱,用來標(biāo)識常量字符串的救巷,另外宏定義末尾不加分號
由于預(yù)處理是在編譯之前壶熏,故預(yù)處理不做語法檢查
且宏定義不分配內(nèi)存,變量定義才會分配內(nèi)存
1.2 帶參數(shù)的宏定義及其替換 : #define 標(biāo)識符(參數(shù)表) 字符串
對帶參數(shù)的宏定義進行宏替換時浦译,不僅對宏標(biāo)識符作字符串替換棒假,還必須做參數(shù)的替換
例: 有宏定義 #define Func(x) (x*x)
,則 Fun(a+B)
將會被替換成什么精盅?
答: 替換成 (a+B*a+B)
可見如果想實現(xiàn)(a+B)*(a+B)
帽哑,則正確的宏定義應(yīng)該為:#define Func(r) ((r)*(r))
故:為了避免宏替換時發(fā)生錯誤,宏定義中的宏參數(shù)應(yīng)加上括號
宏定義可以嵌套使用:
例:
#define ADD(x, y) x+y
int m = 3;
m + = m * ADD(m, m);
則 m = ?
解析:
m + = m* ADD(m, m);
m = m + m * m + m = 3+ 3*3 +3 = 15
1.3 宏定義的本質(zhì)即文本替換:
關(guān)于宏定義和宏替換注意點
- 宏名一名大寫(標(biāo)識符)叹俏;宏名與參數(shù)括號之間不能有空格妻枕,末尾無分號
- 宏替換只做替換,不檢查語法粘驰,不做計算屡谐,不做表達式求解
- 宏替換在編譯前進行,不分配內(nèi)存蝌数,函數(shù)調(diào)用在編譯后程序運行時進行愕掏,并分配內(nèi)存
- 函數(shù)只有一個返回值,利用宏則可設(shè)法有多個值
- 宏替換使源程序變長顶伞,函數(shù)調(diào)用不會
- 宏替換不占運行時間饵撑,只占編譯時間,函數(shù)調(diào)用占運行時間
注: 應(yīng)盡量少用宏替換唆貌,在C++中滑潘,宏替換實現(xiàn)的常量功能由const,enum
代替锨咙,帶參數(shù)的宏替換由模板內(nèi)聯(lián)函數(shù)代替
2. 文件包含 #include
#include <iostream>
:< >標(biāo)準(zhǔn)頭文件
#include "a.h"
: " "自定義頭文件
3. 條件編譯
作用:可使同一源程序根據(jù)不同編譯條件(參數(shù))產(chǎn)生不同的目標(biāo)代碼语卤,便于調(diào)試和移植
形式:(條件編譯控制語句有不同形式)
#if / ifdef / ifndef
#elif
#else
#endif
文件包含需避免多重
包含,下面介紹利用條件編譯語句避免多重包含:
- 1酪刀、為避免名字沖突粱侣,預(yù)處理器變量經(jīng)常用大寫字母表示
- 2、預(yù)處理器變量有兩種狀態(tài):已定義和未定義
#define
指示一個名字并定義該名字為預(yù)處理器變量
#ifndef
檢測指定的預(yù)處理變量是否未定義蓖宦,如果預(yù)處理器變量未定義齐婴,那么跟在其后的所有語句都被處理,直到出現(xiàn)#endif
舉個格式例子
#ifndef SALESITEM_H
#define SALESITEM_H
// 此處是某個類的定義與相關(guān)函數(shù)定義
#endif
為了保證頭文件在給定的源文件中只處理一次稠茂,首先檢測#ifndef
柠偶,若第一次處理,則#ifndef
后面的語句執(zhí)行睬关,直到#endif
诱担,那樣,已定義過后电爹,之后編譯時就會忽略蔫仙。