C語言巨集定義總結
技術標籤:c語言
linux C語言開發系列
第一章 巨集定義深入探討C語言巨集定義總結
前言
巨集定義是C語言中比較重要的一個部分,可以完成很多重要的功能,下面就對目前應用到的地方進行一個總結。一、巨集定義什麼?
C語言中,可以用 #define 定義一個識別符號來表示一個常量。
其特點是:定義的識別符號不佔記憶體,只是一個臨時的符號,預編譯後這個符號就不存在了。
預編譯又叫預處理。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。
二、巨集定義初探
1.使用巨集定義
用 #define 定義識別符號的一般形式為:
#define 識別符號 常量 //注意, 最後沒有分號
我們可以用gcc來簡單測試一下。
首先新建一個測試檔案 test.c
#include <stdio.h>
/*--------------------------------------巨集定義-------------------------------------------*/
#define PI 3.1415926
/*--------------------------------------------------------------------------------------*/
int main()
{
printf("PI = %.04f\n",PI);
return 0;
}
然後在終端輸入
gcc -E test.c -o test.i
gcc -E引數是預編譯指令,可以將原始檔中的巨集定義全部展開,-O 是指定生成目標檔名稱。
開啟預編譯出來的test.i 檔案,我們可以看到
int main()
{
printf("PI = %.04f\n",3.1415926);
return 0;
}
”PI“被替換成了3.1415926
2.取消巨集定義
用 #undef 定義識別符號的一般形式為:
#undef 識別符號 //注意, 最後沒有分號
這個語句用來取消對識別符號的定義。
我們可以測試一下,在test.c檔案中增加語句
#include <stdio.h>
/*------------------------------巨集定義---------------------------------------*/
#define PI 3.1415926
/*---------------------------------------------------------------------------*/
int main()
{
printf("PI = %.04f\n",PI);
#undef PI
printf("PI = %.04f\n",PI);
return 0;
}
然後在終端輸入
gcc -E test.c -o test.i
開啟預編譯出來的test.i 檔案,我們可以看到
int main()
{
printf("PI = %.04f\n",3.1415926);
printf("PI = %.04f\n",PI);
return 0;
}
第一個”PI“被替換成了3.1415926
第二個”PI“沒有被替換,因為關於PI的巨集定義被取消了
我們編譯一下,生成目標檔案看一下
在終端輸入
gcc test.c -o hello
可以看到,在第18行處報錯,‘PI’未定義
三、#符和##連線符的使用
1.字串化操作
在C語言的巨集定義中,#的功能是將其後面的巨集引數進行字串化操作(Stringfication),簡單說就是在對它所引用的巨集變數 通過替換後在其左右各加上一個雙引號。
用 # 字串化操作的一般形式為:
#define printf(EXP) printf(#EXP)
我們還是在test.c檔案中測試一下
#include <stdio.h>
/*------------------------------巨集定義--------------------------------------*/
#define LOG(EXP) printf(#EXP)
/*--------------------------------------------------------------------------*/
int main()
{
int divider = 0;
LOG(divider);
return 0;
}
我們還是預編譯一下,在終端中輸入
gcc -E test.c -o test.i
開啟預編譯出來的test.i 檔案,我們可以看到
int main()
{
int divider = 0;
printf("divider");
return 0;
}