C語言之預處理命令基礎----防備忘


C語言之預處理命令基礎----防備忘


C語言的預處理命令:
①宏定義
②文件包含
③條件編譯

1.宏定義----#define
①不帶參數的宏定義

#define PI 3.1415926
//①宏名一般習慣大寫;
//②宏定義只是簡單的字符串替換,不做正確性檢查,且不分配內存空間;
//③宏定義不是C語句,末尾不必添加分號;
#define CirCle PI*3
//④宏定義可以層層置換

②終止宏定義的作用域 #undef

#define G 9.8
void main()
{
}
#undef G   //注意這裏的G別忘記了

③帶參數的宏定義【相當於一個函數使用】

#define 宏名(參數表) 字符串

eg:

#define MAX(x,y) (x)>(y)? (x):(y)
//相對於函數來說,宏展開不爲形參分配臨時的內存單元,也不存在類型問題,參數也無類型
//宏定義時,字符串可以是任何類型的數據
//宏替換不佔用運行時間,函數調用佔用運行時間,宏替換佔用編譯時間

④宏展開得多值結果

#define PI 3.14
#define CIRCLE(R,L,E) R=PI*4;L=PI*PI*3;E=PI*5
//函數調用只可以得到一個返回值,而宏可以設法得到幾個結果【有點狗血】

2.文件包含#include
主要說一下,使用尖括號< >和雙引號" “的區別
① 使用尖括號< >,編譯器會到系統路徑下查找頭文件;
②使用雙引號” ",編譯器首先在當前目錄下查找頭文件,如果沒有找到,再到系統路徑下查找。也就是說,使用雙引號比使用尖括號多了一個查找路徑,它的功能更爲強大。

3.條件編譯☆☆☆☆☆☆
①#if用法

#if 整型常量表達式1
	程序段1
#elif 整型常量表達式2
	程序段2
#elif 整型常量表達式3
	程序段3
#else
	程序段4
#endif
//如常“表達式1”的值爲真(非0),就對“程序段1”進行編譯,
//否則就計算“表達式2”,結果爲真的話就對“程序段2”進行編譯,
//爲假的話就繼續往下匹配,直到遇到值爲真的表達式,或者遇到 #else。
//這一點和 if else 非常類似。

【注】:#if 命令要求判斷條件爲“整型常量表達式”,也就是說,表達式中不能包含變量,而且結果必須是整數,與if是不同的。

②#ifdef用法

#ifdef 標識符
	程序段1
#else
	程序段2
#endif
//如果當前的宏已被定義過,即上面的標識符,則對“程序段1”進行編譯,
//否則對“程序段2”進行編譯。也可以省略 #else:

#ifdef  標識符
    程序段
#endif

eg:

只要在上述條件編譯命令之前有以下宏定義就行
#define INTEGER 0
後面的宏替換字符串是多少都無所謂,有無也無所謂
#define INTEGER    //也行
#ifdef  INTEGER
    程序段   //將被執行
#endif

③#ifndef用法

#ifndef 標識符
	程序段1
#else
	程序段2
#endif
//如果當前的宏“沒有”被定義過,即上面的標識符,則對“程序段1”進行編譯,
//否則對“程序段2”進行編譯。也可以省略 #else:

④關於條件編譯的一點理解:

我在理解條件編譯的時候,比如在理解#if…#else…#endif的時候,這個和if…else根本沒什麼區別啊,那直接用後者不就行了嗎?
直到我遇到了一個問題:

int main()
{
	int obj=9;
#if obj==9
	printf("正確\n");  //①
#else
	printf("錯誤\n");  //②
#endif
}

結果總是輸出錯誤,我百思不得其解!!!按照我的邏輯obj=9,應該執行①的語句。實則不然,真是我的理解不到位。

首先來說C語言的運行過程,分爲下面四個步驟:
1.編輯:輸入源程序並存盤(.C)
2.編譯:將源程序翻譯爲目標文件(.OBJ)
3.鏈接:將目標文件生成可執行文件( .EXE)
4.運行:執行.EXE文件,得到運行結果

#if名爲條件編譯,固然它是在編譯階段運行的。而"int obj=0;",則是在程序運行階段運行的。這樣的話呢,在編譯階段根本沒有所謂的obj,所以obj也就是不存在的,不會執行①處的語句。 那應該怎麼修改呢?
將"int obj=0;“改爲”#define obj 9"就可以了。因爲#define也是在編譯階段進行的。
所以#if的使用場合呢,比如,你這一套代碼,要在兩個型號不同的單片機或者板子上使用,就可以用#define定義不同的意思,從而讓#if去執行相應的適合本單片機的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章