1. 程式人生 > 其它 >C語言巨集定義總結

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

gcc 報錯圖片
可以看到,在第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;
}

總結