【C++】宏(#define)和内联函数(inline)的理解以及区别

宏(#define)和内联函数(inline)的理解以及区别:

       缺点:

              1.宏没有类型检测,不安全

              2.宏是在预处理时进行简单文本替换,并不是简单的参数传递(很难处理一些特定情况。例如:Add(z++))

              3.使代码变长

              4.宏不能进行调试

              5.当预处理搜索#define定义的符号时,字符串常量并不被搜索

      优点:

             1.加快了代码的运行效率

             2.让代码变得更加的通用

  • 内联函数

特点:

        (1.)类中的成员函数是默认的内联函数

            (2.)内联函数内不准许有循环语句和开关语句

            (3.)内联函数的定义必须出现在第一次调用内联函数之前

 

缺点:

             代码变长,占用更多内存

优点:

          1.有类型检测,更加的安全

          2.内联函数是在程序运行时展开,而且是进行的是参数传递

          3.编译器可以检测定义的内联函数是否满足要求,如果不满足就会当作普通函数调用(内联函数不能递归,内联函数不能太大)

 

 

  • 对比

相同点:

                  两者都是可以加快程序运行效率,使代码变得更加通用

不同点:

               1.内联函数的调用是传参,宏定义只是简单的文本替换

               2.内联函数可以在程序运行时调用,宏定义是在程序编译进行

               3.内联函数有类型检测更加的安全,宏定义没有类型检测

               4.内联函数在运行时可调式,宏定义不可以

               5.内联函数可以访问类的成员变量,宏不可以

               6.类中的成员函数是默认的内联函数

 

回答: C++中的函数宏定义内联函数有一些区别。函数宏定义是在预编译阶段将名替换为体,它不是真正的函数,而是一种字符串替换的机制。宏定义没有类型检查,无论对还是错都会直接替换。而内联函数是真正的函数,使用inline修饰,编译器会在调用内联函数的地方展开,没有函数压栈的开销,提高了程序的运行效率。内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,如while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动将其变为普通函数。内联函数在编译阶段进行代码插入,而宏定义是在预编译阶段进行代码展开。因此,内联函数在编译时会进行类型检查,而宏定义没有类型检查。此外,内联函数使用可以提高程序的效率,而宏定义使用可以省去函数调用的开销。\[1\]\[2\] 然而,需要注意的是,宏定义内联函数使用时都是进行代码展开。对于宏定义,预处理器会将所有的名替换为体;而对于内联函数,编译器会在每处调用内联函数的地方直接将内联函数的内容展开。这样可以省去函数压栈退栈的开销,提高了程序的效率。\[2\] 举个例子来说明宏定义内联函数区别。假设有以下代码: #include <iostream> using namespace std; #define MAX(a,b) (a > b ? a:b) int main() { int a = 10; int b = 20; cout << MAX(a, ++b) << endl; return 0; } 这段代码中,宏定义MAX(a, b)会将a和b进行比较,并返回较大的值。在调用MAX(a, ++b)时,宏定义会将其展开为(a > ++b ? a:b)。由于宏定义是字符串替换,所以++b会被展开两次,导致b的值增加了两次。因此,输出结果为22。\[3\] #### 引用[.reference_title] - *1* *3* [C++:在代码中理解宏定义内联函数](https://blog.csdn.net/qq_43825377/article/details/116211242)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++内联函数宏定义](https://blog.csdn.net/luolaihua2018/article/details/115377860)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值