C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用
宏定義與預(yù)處理命令
- 預(yù)處理階段:處理宏定義與預(yù)處理命令;
- 編譯期:檢查代碼,分析語法、語義等,最后生成.o或.obj文件;
- 鏈接期:鏈接所有的.o或.obj文件,生成可執(zhí)行文件。

預(yù)處理命令 - 宏定義
定義符號常量
#define PI 3.1415926 #define MAX_N 10000
定義傻瓜表達(dá)式
#define MAX(a, b) (a) > (b) ? (a) : (b) #define S(a, b) a * b
定義代碼段
\ 為連接符
#define P(a) { \
printf("%d\n", a); \
}
預(yù)定義的宏
常見的預(yù)定義的宏
| 宏 | 說明 |
|---|---|
| __ DATE__ | 日期:Mmm dd yyyy |
| __ TIME__ | 時間:hh:mm:ss |
| __ LINE__ | 行號 |
| __ FILE__ | 文件名 |
| __ func__ | 函數(shù)名/非標(biāo)準(zhǔn) |
| __ FUNC__ | 函數(shù)名/非標(biāo)準(zhǔn) |
| __ PRETTY_FUNCTION__ | 更詳細(xì)的函數(shù)信息/非標(biāo)準(zhǔn) |
示例:
#include<stdio.h>
int main(){
//首次編譯的時間
//[Jun 10 2022 09:46:48]
printf("[%s %s]\n", __DATE__, __TIME__);
//代碼行號:文件名:函數(shù)名
//[6 : E:\2023考研\(zhòng)專業(yè)課\C語言\define.cpp : main]
printf("[%d : %s : %s]\n", __LINE__, __FILE__, __func__);
return 0;
}
函數(shù) VS 宏定義
作用時期:函數(shù)作用在編譯期,宏定義作用在預(yù)編譯期;
使用:函數(shù)需要利用額外的棧,因此需要額外的時間開銷,相比宏定義更加節(jié)約時間但會浪費更多空間;
預(yù)處理命令 - 條件式編譯
| 函數(shù) | 說明 |
|---|---|
| #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宏 則結(jié)果為 420 個字節(jié)
//如果定義了DEBUG宏,則結(jié)果為 4020 個字節(jié)
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的函數(shù),輸出所在函數(shù)及行號等信息
#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考研\(zhòng)專業(yè)課\C語言\log.cpp : main : 12] a = 123, b = 13
log("a = %d, b = %d", a, b);
//[E:\2023考研\(zhòng)專業(yè)課\C語言\log.cpp : main : 13] hello
log("hello");
return 0;
} 到此這篇關(guān)于C語言詳細(xì)分析宏定義與預(yù)處理命令的應(yīng)用的文章就介紹到這了,更多相關(guān)C語言宏定義內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言詳解結(jié)構(gòu)體的內(nèi)存對齊與大小計算
C 數(shù)組允許定義可存儲相同類型數(shù)據(jù)項的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲不同類型的數(shù)據(jù)項,本篇讓我們來了解C 的結(jié)構(gòu)體內(nèi)存對齊與計算大小2022-04-04
MFC中動態(tài)創(chuàng)建控件以及事件響應(yīng)實現(xiàn)方法
這篇文章主要介紹了MFC中動態(tài)創(chuàng)建控件以及事件響應(yīng)實現(xiàn)方法,詳細(xì)講解了MFC中動態(tài)創(chuàng)建控件以及事件響應(yīng)的概念與實現(xiàn)方法,具有一定的實用價值,需要的朋友可以參考下2014-10-10

