宏定义,宏函数和内联函数

  • 宏是什么:
    • 简单宏替换出现的问题:
    • 带参数的宏定义(宏函数):
    • 宏的优点:
    • 宏的缺陷,内联函数的引入
    • 内联函数(空间换时间)

宏是什么:

宏(#define)命令是C语言中的一个宏定义命令,它用来将一个标识符定义为-个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。
该命令有两种格式:
①简单的宏定义
②带参数的宏定义。

简单宏定义:

#define N 100
int main(){int sum = 20 + N;printf("%d\n", sum);return 0;
}

#define N 100就是宏定义。N为宏名,100是宏的内容。预处理阶段,对程序中所有出现的“宏名”,预处理器都会用宏定义中的字符串去代换,这称为“宏替换”或“宏展开”。这样做的优势是

宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的。

简单宏替换出现的问题:

但是我们在宏替换时会出现以下这类问题:

#define N 2+2
void main()
{int a=N*N;
printf( "a=%d",a);
}

我们预想的是输出结果为:a=16
然而实际结果却为:a=8
原因:在宏替换的时候编译器在预处理阶段只是进行简单的文本替换,所以预处理后的代码为:

#define N 2+2
void main()
{int a=2+2*2+2;
printf( "a=%d",a);
}

所以一般情况下要想达到我们预期的目的,应该在应替换的宏内容加括号:

#define N (2+2)

带参数的宏定义(宏函数):

也就是我们常说的宏函数也是在预处理阶段进行文本替换,只不过多了个参数,它形如函数
常见使用方法:#define A(x) x

#define area(x) x*x
void main()
{int y=area(2+2);
printf("%d",y);
}
//预处理展开
#define area(x) x*x
void main()
{int y=2+2*2+2;
printf("%d",y);
}

解释:
2+2就是传给x的参数,而此参数也是纯文本,即:x在被替换的时候就是纯文本2+2,不进行任何计算和修饰

它也是一种纯文本替换,实际输出结果为:8,并非16
所以我们为了避免逻辑出错,在替换文本处加括号:

#define area(x) (x)*(x)

宏的优点:

1.提高运行效率
用宏函数代替普通函数调用可以节省系统开销,提高运行效率,因为它不像普通函数那样需要开辟栈帧。
2.代码便于修改
需要对代码进行维护的时候,我们只需要更改宏体就能对整个代码进行维护,没必要一个个的去改

宏的缺陷,内联函数的引入

宏虽然有着一定的优势,但是它的缺点也不可忽视。在编译阶段,我们就不好发现代码哪里出问题了,因为宏替换是发生在预处理阶段,所以有时候在宏函数传参的时候发生一些错误,编译器不会发现,那它调试起来就很麻烦。

所以为了解决这种问题,我们就有了内联函数

内联函数(空间换时间)

概念:以inline修饰的函数叫做内联函数,编译阶段(更加安全)C++编译器会在调用函数的地方展开,没有压栈开销,内联函数提升程序运行效率。
特性:
1. inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到

宏定义,宏函数和内联函数相关推荐

  1. C++宏函数和内联函数

    C++宏函数和内联函数 1. 宏常量&宏函数 1.1 定义 // a. 定义一个宏常量 #define MAX 1024 // 宏常量 MAX称为符号常量// b. 定义一个宏函数 // 宏函 ...

  2. 【C/C++】宏函数与内联函数的区别

    [C/C++]宏函数与内联函数的区别 文章目录 [C/C++]宏函数与内联函数的区别 一.概念 二.特性 三.优缺点 3.1 内联函数的优缺点? 3.2 宏的优缺点? 四.笔试题 4.1 为什么要是用 ...

  3. 对普通函数、宏函数、内联函数的作用机制的探索

    这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...

  4. mysql 内联函数_内联函数 - freeboy小亮 - 博客园

    (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...

  5. java内联函数_Java之内联函数_内联函数的优缺点

    描述 内联函数 1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 2.Java语言中有一个关键字fina ...

  6. 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...

  7. C++:构造函数重载类内定义函数(内联函数)

    构造函数的重载 构造函数是可以重载的,即写多个构造函数,它们具有不同的参数表和相同的名称,如果没有参数信息,编译器就认为调用默认构造函数. 特点 重载构造函数具有不同的参数表和相同的名称 根据传参个数 ...

  8. c++中内敛函数_C++ 内联函数 | 菜鸟教程

    内联函数: Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数. 定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. 优点: 当函数体比较 ...

  9. C++类里面的哪些成员函数是内联函数?

    类定义的内联函数分为以下3种: 1.隐式内联 class Person { public:Person(const string &name){Name = name;}void printN ...

最新文章

  1. ubuntu下mysql中文乱码_Ubuntu的MySQL中文乱码问题--自己躺坑
  2. 印度资深数字货币研究员::我为什么选择BCH?
  3. Mark: Fisrt note with live writer
  4. DeepMind新语言模型SUNDAE:教自动编码器学会「自我纠正」,WMT14英德互译任务获SOTA...
  5. 【Linux】数据库管理
  6. mysql buffer size_mysql中join_buffer_size的建议最大值是多少?
  7. 喇叭正反相位测试音频_FIR滤波器能给音频扩声带来怎样的帮助?
  8. 听说图像识别很难,大神十行代码进行Python图像识别
  9. _int64_在Linux对应对文件,linux下32位机与64位机基本数据类型长度对比
  10. php查询排序,php如何对查询结果集进行排序
  11. 基于ForkJoin构建一个简单易用的并发组件
  12. windows phone开发环境搭建
  13. php 字符串长度判断_php 字符串长度判断更高效的方法
  14. Unity优化百科(UWA 博客目录)
  15. 地图-导航(百度/高德)
  16. 前沿 | 抗击黑产 阿里安全八大实验室首秀技术实力
  17. srt字幕怎么导入视频 (视频字幕合并教程)
  18. 基于成交历史的交易播放器
  19. replaceAll(xxxx, File.separator); 报错character to be escaped is missing-1
  20. 杰理AC6965E开发资料共享

热门文章

  1. pn532复制小区门卡到手环
  2. 计算机SCI论文重复率需要控制在多少? - 易智编译EaseEditing
  3. WPF 实现语言在线切换
  4. 饥荒显示服务器未响应是什么意思,微软或将在本周内推送Win10 10586.71累积更新(图)...
  5. Linux服务篇:CentOS 6.9搭建NTP服务器
  6. windows 分屏
  7. 2D人体骨架检测算法综述
  8. 版式设计分析_版式-字母形式剖析
  9. WACV 2023 | ImPosing:用于视觉定位的隐式姿态编码
  10. java实现二叉搜索树