首頁 > 軟體

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

2022-07-02 14:00:02

宏定義與預處理命令

  • 預處理階段:處理宏定義與預處理命令;
  • 編譯期:檢查程式碼,分析語法、語意等,最後生成.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("%dn", 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語言宏定義內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com