C語言詳細分析宏定義與預處理命令的應用

宏定義與預處理命令

  • 預處理階段:處理宏定義與預處理命令;
  • 編譯期:檢查代碼,分析語法、語義等,最後生成.o或.obj文件;
  • 鏈接期:鏈接所有的.o或.obj文件,生成可執行文件。

預處理命令 – 宏定義

定義符號常量

#define PI 3.1415926
#define MAX_N 10000

定義傻瓜表達式

#define MAX(a, b) (a) > (b) ? (a) : (b)
#define S(a, b) a * b

定義代碼段

\ 為連接符

#define P(a) { \
	printf("%d\n", a); \
}

預定義的宏

常見的預定義的宏

說明
__ DATE__ 日期:Mmm dd yyyy
__ TIME__ 時間:hh:mm:ss
__ LINE__ 行號
__ FILE__ 文件名
__ func__ 函數名/非標準
__ FUNC__ 函數名/非標準
__ PRETTY_FUNCTION__ 更詳細的函數信息/非標準

示例:

#include<stdio.h>
int main(){
	//首次編譯的時間
	//[Jun 10 2022 09:46:48]
	printf("[%s %s]\n", __DATE__, __TIME__);
	//代碼行號:文件名:函數名
	//[6 : E:\2023考研\專業課\C語言\define.cpp : main]
	printf("[%d : %s : %s]\n", __LINE__, __FILE__, __func__);
	return 0;
}

函數 VS 宏定義

作用時期:函數作用在編譯期,宏定義作用在預編譯期;

使用:函數需要利用額外的棧,因此需要額外的時間開銷,相比宏定義更加節約時間但會浪費更多空間;

預處理命令 – 條件式編譯

函數 說明
#ifdef DEBUG 是否定義瞭BEBUG宏
#ifndef DEBUG 是否沒定義DEBUG宏
#if MAX_N == 5 宏 MAX_N 是否等於5
elif MAX_N == 4 否則宏MAX_N是否等於4
#else  
#endif  

示例:

#include<stdio.h>
//定義DEBUG宏
#define DEBUG 
//判斷是否定義瞭DEBUG宏
#ifdef DEBUG
#define MAX_N 1000
#else
#define MAX_N 100
#endif 
int main(){
	int arr[MAX_N + 5] = {0};
	//如果沒定義瞭DEBUG宏 則結果為 420 個字節 
	//如果定義瞭DEBUG宏,則結果為 4020 個字節 
	printf("sizeof(arr) = %lu \n", sizeof(arr)); 
	return 0;
}

示例

沒有BUG的MAX宏

#define MAX(a, b)({\
	__typeof(a) _a = a;\
	__typeof(b) _b = b;\
	_a > _b ? _a:_b;\
})

打印LOG的函數,輸出所在函數及行號等信息

#include<stdio.h>
//打開log宏
#define DEBUG
//條件式編譯
//變參宏
//args加##後表連接 此時args可為空 
#ifdef DEBUG
#define log(format, args...){\
	printf("[%s : %s : %d] ", __FILE__, __func__, __LINE__);\
	printf(format, ##args);\
	printf("\n");\
}
#else
#define log(format, args...)
#endif
int main(){
	int a = 123, b = 13;
	//[E:\2023考研\專業課\C語言\log.cpp : main : 12] a = 123, b = 13
	log("a = %d, b = %d", a, b);
	//[E:\2023考研\專業課\C語言\log.cpp : main : 13] hello
	log("hello");
	return 0;
} 

到此這篇關於C語言詳細分析宏定義與預處理命令的應用的文章就介紹到這瞭,更多相關C語言宏定義內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: