網站首頁 編程語言 正文
宏定義與預處理命令
- 預處理階段:處理宏定義與預處理命令;
- 編譯期:檢查代碼,分析語法、語義等,最后生成.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;
}
原文鏈接:https://blog.csdn.net/zkx990121/article/details/125207188
相關推薦
- 2022-01-19 標準時間格式轉換(正則寫法)
- 2022-04-05 Android判斷是否Root方法介紹_Android
- 2022-10-26 jQuery中DOM?屬性使用實例詳解下篇_jquery
- 2022-12-25 Flutter桌面開發windows插件開發_Android
- 2022-12-31 Python中CSV文件的讀寫庫操作方法_python
- 2022-08-25 python數學建模(SciPy+?Numpy+Pandas)_python
- 2022-10-07 C語言一個函數如何實現好幾個return返回值_C 語言
- 2022-07-29 Linux中Vi和Vim編輯器用法詳解_linux shell
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支