服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++宏函数和内联函数的使用

C++宏函数和内联函数的使用

2023-02-21 16:30小名王能全 C/C++

本文主要介绍了C++宏函数和内联函数的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1. 宏常量&宏函数

1.1 定义

?
1
2
3
4
5
6
// a. 定义一个宏常量
#define MAX 1024 // 宏常量  MAX称为符号常量
 
// b. 定义一个宏函数
// 宏函数:宏函数就是使用宏定义定义出来的函数,并不是真正意义上的函数。
#define GETSUM(x, y) ((x) + (y)) // 宏函数

1.2 使用宏函数的注意事项

  • 要保证运算的完整性;
  • 宏函数的使用场景:频繁调用和短小的函数,封装成宏函数;
  • 使用宏函数的优点:以空间换时间;

2. 内联函数

2.1 定义

内联函数,C++独有;

​ 内联函数本质也是一个普通的函数,解决了宏函数的缺陷;

?
1
2
3
4
5
6
// 内联函数在函数声明和函数定义上都要加上inline关键字。
inline int fun();
inline int fun()
{
        cout << "fun..." << endl;
}

2.2 某些情况编译器不会做内联编译

  • 不能存在任何形式的循环语句
  • 不能存在过多的条件判断语句
  • 函数体不能过于庞大
  • 不能对函数进行取地址的操作

3. 补充

3.1 宏定义和函数的区别

  • 宏在预处理阶段完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数;
  • 宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值;
  • 宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型;
  • 宏定义不要在最后加分号;

3.2 宏定义和typedef的区别

  • 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名;
  • 宏替换发生在预编译阶段之前,属于文本插入替换;typedef是编译的一部分;
  • 宏不检查类型;typedef会检查数据类型;
  • 宏不是语句,不在在最后加分号;typedef是语句,要加分号标识结束;
  • 注意对指针的操作,typedef char * p_char和#define p_char char *区别巨大;

3.3 宏函数和内联函数的区别

  • 在使用时,宏只做简单字符串替换(编译前)。而内联函数可以进行参数类型检查(编译时),且具有返回值;
  • 内联函数在编译时直接将函数代码嵌入到目标代码中,省去函数调用的开销来提高执行效率,并且进行参数类型检查,具有返回值,可以实现重载;
  • 宏定义时要注意书写(参数要括起来)否则容易出现歧义(保证运算的完整性),内联函数不会产生歧义;
  • 内联函数有类型检测、语法判断等功能,而宏没有;

3.4 define宏定义和const的区别

  • 处理阶段:define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用;
  • 安全性:
    • define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部的内容,要不然很容易出错;
    • const常量有数据类型,编译器可以对其进行类型安全检查;
  • 内存占用
    • define只是将宏名称进行替换,在内存中会产生多分相同的备份。const在程序运行中只有一份备份,且可以执行常量折叠,能将复杂的的表达式计算出结果放入常量表
    • 宏定义的数据没有分配内存空间,只是插入替换掉;const定义的变量只是值不能改变,但要分配内存空间。

 到此这篇关于C++宏函数和内联函数的使用的文章就介绍到这了,更多相关C++宏函数和内联函数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_56077202/article/details/125571831

延伸 · 阅读

精彩推荐
  • C/C++C语言数组全面总结梳理

    C语言数组全面总结梳理

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数...

    i跑跑8522022-09-21
  • C/C++C++中指向结构体变量的指针

    C++中指向结构体变量的指针

    结构体变量的指针就是该变来那个所占据的内存段的起始地址。可以设一个指针变量,来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地...

    C++教程网9752021-01-07
  • C/C++下标操作符重载模拟多维数组详解

    下标操作符重载模拟多维数组详解

    虽然不能直接实现一对下标操作符重载,但是我们可以间接模拟。思路是这样的,先通过单下标操作返回一个具有下标操作能力的左值,对左值进行下标操...

    C语言教程网11502020-12-29
  • C/C++C++类URL编码和解码使用技巧

    C++类URL编码和解码使用技巧

    在项目开发过程中,经常会使用到c++ 的url编码和解码,本文将以此问题详细介绍使用技巧,需要的朋友可以参考下...

    C++教程网3182020-11-12
  • C/C++C语言实现高精度加法

    C语言实现高精度加法

    这篇文章主要为大家详细介绍了C语言实现高精度加法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    summer_awn12312021-11-04
  • C/C++c++中的volatile和variant关键字详解

    c++中的volatile和variant关键字详解

    大家好,本篇文章主要讲的是c++中的volatile和variant关键字详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下...

    fpcc7762022-09-06
  • C/C++C语言数据结构与算法之排序总结(一)

    C语言数据结构与算法之排序总结(一)

    这篇文章主要介绍了数据结构与算法中的插入类和交换类的各种排序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

    知心宝贝9092022-07-16
  • C/C++C语言 超详细梳理总结动态内存管理

    C语言 超详细梳理总结动态内存管理

    动态内存是相对静态内存而言的。所谓动态和静态就是指内存的分配方式。动态内存是指在堆上分配的内存,而静态内存是指在栈上分配的内存,本文带你...

    二球悬铃木丶7582022-11-01