網站首頁 編程語言 正文
1、概念
#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字符串,該標識符被稱為宏名,被定義的字符串稱為替換文本。
命令有兩種格式:一種是簡單的宏定義,另一種是帶參數的宏定義。
(1)簡單的宏定義:
#define<宏名> <字符串>
#defineVALUE((sizeof(a))/sizeof(a[0]))
(2) 帶參數的宏定義
#define<宏名> (<參數表>)<宏體>
#defineMAX(a,b)((a)>(b)?(a):(b))
2、不能忽略宏定義中的空格
下面的宏定義中f是否帶了參數呢?
#definef(x)((x)+1)
答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。
#define f (x)((x)+1)
預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發現。
3、宏不是函數
如果我們定義一個宏:
#defineMAX(a,b)a>b?a:b
當我們執行一個語句:
3+MAX(1,3);
我們期望的答案應該是6才對,其實呢,運行之后的答案1。與宏定義相掛鉤的就是優先級,算數運算符的優先級高于條件運算符,展開如下。
3+1>3?1:3,首先進行算符運算符的運算,即4>3?1:3,所以答案為1。
請注意宏定義中的括號,這些括號的作用就是預防引起優先級相關的問題。有些專家建議在C語言中只要牢記兩個優先級就夠了,乘除法優先級高于加減法,在設計其它操作符時,一律加上括號。
4、宏定義不是說明或語句
在行末不必加分號,如加上分號則連分號也一起置換
5、宏不是類型定義
首先定義一個宏
#definepCharchar*
再用pChar 定義兩個變量,之后用操作符sizeof讀取變量所占用內存大小,如果是指針類型的就占4個字節,如果是字符型的就占1個字節。
結果占用空間不一樣,變量類型自然不一樣,所以宏定義不是類型定義。那如果我換成typedef來定義類型呢?
宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明。
6、與之相關的宏定義
編寫程序過程中,很多都需要條件編譯,來看一個常用的使用方法。
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
7、總結
宏的本質是代碼替換。
原文鏈接:https://blog.csdn.net/yx5666/article/details/126891289
相關推薦
- 2022-03-17 .NET?6開發TodoList應用實現結構搭建_實用技巧
- 2022-01-11 require from ‘xxx‘是如何找到node_modules目錄下的依賴包?
- 2022-06-07 victoriaMetrics庫布隆過濾器初始化及使用詳解_Golang
- 2022-01-18 移動端自適應布局(viewport+rem)
- 2022-06-01 詳解Pandas中stack()和unstack()的使用技巧_python
- 2022-09-19 pytorch中使用LSTM詳解_python
- 2022-05-07 Python列表的淺拷貝與深拷貝_python
- 2022-12-07 C語言內存分布與heap空間分別詳細講解_C 語言
- 最近更新
-
- 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同步修改后的遠程分支