網站首頁 編程語言 正文
宏函數(帶參數的宏)的缺點
第一個問題:宏函數看起來像一個函數調用,但是會有隱藏一些難以發現的問題。
例如:
#define FUN(x, y) (x * y)
printf("%d", add(3, 3 + 2)) //3 * 3 + 2 = 11
以上情況可以通過加 “()” 解決:
#define FUN(x, y) (x * y)
printf("%d", add(3, (3 + 2))) //3 * (3 + 2) = 15
特殊情況加()也保證不了參數的完整性:
#define GET_MAX_DATA(a, b) ((a)>(b)?(a):(b))
void test02()
{
int a = 3;
int b = 5;
//((a)>(++b)?(a):(++b)) 無法保證參數的完整性
printf("最大值為:%d\n", GET_MAX_DATA(a,++b));//7
}
第二個問題是c++特有的,預處理器不允許訪問類的成員,即預處理器宏不能用作類的成員函數
內聯函數:內聯函數為了繼承宏函數的效率,沒有函數調用時開銷,然后又可以像普通函數那樣,可以進行參數,返回值類型的安全檢查,又可以作為成員函數
內聯函數:是一個真正的函數。函數的替換 發生在編譯階段
inline修飾的函數就是內聯函數
inline int myAdd(int x, int y)//inline必須出現在函數的定義處
{
return x+y;
}
內聯函數為了繼承宏函數的效率,沒有函數調用時開銷,然后又可以像普通函數那樣,可以進行參數, 返回值類型的安全檢查,又可以作為成員函函數。
內聯函數:是在編譯階段 完成的替換。
inline int my_mul(int x,int y)
{
return x*y;
}
void test01()
{
cout<<"my_mul = "<<my_mul(10+10,20+20)<<endl;
}
任何在類內部定義的函數自動成為內聯函數。
內聯函數的特點
1、能保證參數的完整性
2、有作用域的限制,可以成為類的成員
3、類中的成員函數 默認都是內聯函數(不用inline)
內聯函數的要求:
不能存在任何形式的循環語句 不能存在過多的條件判斷語句 函數體不能過于龐大 不能對函數進行取地址操作。
內聯僅僅只是給編譯器一個建議。(具體處理方式由編譯器來決定)
宏函數和內聯函數的區別
宏函數:
預處理階段完成替換、沒有出入棧的開銷、不能保證參數的完整性、沒有作用域限制、不能作為類的成員
內聯函數:
編譯階段完成替換、沒有出入棧的開銷、能保證參數的完整性、有作用域限制、能作為類的成員
原文鏈接:https://blog.csdn.net/qq_34981463/article/details/124979909
相關推薦
- 2023-07-25 使用EasyExcel實現Excel的導入導出
- 2022-10-10 使用Pyinstaller打包exe文件詳細圖文教程_python
- 2022-02-15 獲取字符串大括號里面的值 ,并判斷字符串是否符合要求
- 2022-05-05 Tomcat使用https配置實戰教程_Tomcat
- 2022-03-30 Android實現屏幕保持常亮功能_Android
- 2022-07-14 Python實現單例模式的四種方式詳解_python
- 2022-12-23 Android入門之Menu組件的使用教程詳解_Android
- 2022-06-20 一文帶你掌握Go語言運算符的使用_Golang
- 最近更新
-
- 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同步修改后的遠程分支