C++宏函数和内联函数

news/2024/5/20 3:31:41 标签: c++, 宏函数, 内联函数

C++宏函数内联函数

1. 宏常量&宏函数

1.1 定义

// a. 定义一个宏常量
#define MAX 1024 // 宏常量  MAX称为符号常量

// b. 定义一个宏函数
// 宏函数:宏函数就是使用宏定义定义出来的函数,并不是真正意义上的函数。
#define GETSUM(x, y) ((x) + (y)) // 宏函数

1.2 使用宏函数的注意事项

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

2. 内联函数

2.1 定义

内联函数,C++独有;

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

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

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

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

3. 补充

3.1 宏定义和函数的区别

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

3.2 宏定义和typedef的区别

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

3.3 宏函数内联函数的区别

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

3.4 define宏定义和const的区别

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

http://www.niftyadmin.cn/n/974602.html

相关文章

MyBatis开发Dao层的两种方式(原始Dao层开发)

本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例。 Mapper动态代理开发Dao层请阅读我的下一篇博客&#xff1a;MyBatis开发Dao层的两种方式&#xff08;Mapper动态代理方式&#xff09; 本次使用的mybatis版本为mybatis-3.2.7&#xff0c;开发工具为…

drive+colab运行代码

当我们电脑配置不够好&#xff0c;而代码工程又很大的时候&#xff0c;可以借助colab提供的这个平台来跑GPU程序&#xff0c;会提高代码运行的速度。 ①打开 drive ②点击“上传文件夹”&#xff0c;把自己的工程文件夹上传&#xff0c;就可以在colab中使用了 ③打开 colab &a…

C++重复声明

C重复声明 1. 重复声明的问题 如果头文件中有定义(变量、函数、类)&#xff0c;重复包含会产生重复定义的问题C重复包含头文件&#xff0c;编译器拷贝和扫描需要耗费时间、降低效率一般头文件中只放声明&#xff0c;而声明可以多次 2.解决方案 2.1 #ifndef、#define、#endi…

分组密码算法AES-128,192,256 C语言实现第一版

分组密码算法AES-128,192,256 C语言实现第一版 AES的C语言实现入门版 AES分组密码算法中明文分组位128bits&#xff0c;密钥分组可以为128,192,256bits。AES也是由最基本的变换单位——“轮”多次迭代而成的。我们将 AES 中的轮变换计为 Round(State, RoundKey)&#xff0c;Sta…

Python学习备忘录

目录 1. pip 更新报错 2.Jupyter Notebook缺包 3.缺urllib2包 1. pip 更新报错 换成下面这行代码 python -m pip install -U --force-reinstall pip 2.Jupyter Notebook缺包 打开cmd conda info --env 激活环境&#xff0c;如&#xff1a; activate base 最后安装模块 …

C++ extern C

C extern “C” extern “C” : 被extern "C"所修饰的代码会按照C语言的方式去编译。 ​ 格式&#xff1a; extern "C" void fun(); extern "C" void fun(int v); // 或者&#xff1a; extern "C" { void fun() {} void fun(int v)…

APP压力稳定性测试

转自&#xff1a;https://www.cnblogs.com/nuonuozhou/p/8643735.html 1.android系统自带monkey程序&#xff0c;模拟用户触摸屏幕&#xff0c;滑动track ball&#xff0c;按键等操作莱多设备上的程序进行压力测试&#xff0c;检验程序多久的时间会发生异常2.adb &#xff08;a…

BZOJ5322 JXOI2018排序问题

对于一个序列&#xff0c;重排后有序的概率显然是∏cnti!/n!&#xff0c;其中cnti为第i种数出现次数。要使概率最小&#xff0c;显然应该让各种数字尽量平均分配。剩下的是div2BC左右的大讨论。 #include<iostream> #include<cstdio> #include<cmath> #incl…