当前位置: 首页 > news >正文

2、#include和#define

#include和#define

  • 一、#include
  • 二、#define宏定义
    • 1、宏变量
    • 2、宏函数

一、#include

#include是预处理指令,会将头文件直接替换到文件中。

// hello.h
void foo() {int c = 0;int d = 1;
}
// hello.cpp
#include "hello.h"
int main() {int a = 0;int b = a;foo();return 0;
}

执行g++ -E hello.cpp -o hello.i,可以看到预处理后的文件hello.i
在这里插入图片描述
可以看到,hello.h的内容直接替换了#include "hello.h"

二、#define宏定义

#define将进行简单的文本替换。

1、宏变量

#define N 5int main() {int a = 0;int b = N * N - N;return 0;
}

执行预处理后,会直接将文件中的N替换为5。
在这里插入图片描述
这样的简单替换就存在一个问题,假如我们将上面的#define N 5改为

#define N 5+1

那么预处理后得到以下结果,并不是我们期望的。
在这里插入图片描述
所以在定义宏变量时最后将值括起来,如下。

#define N (5 + 1)

这样便能得到期望结果。
在这里插入图片描述

2、宏函数

易错点:
(1)左括号应紧贴宏函数名。

// 错误写法:在FOO后加空格在接括号
#define FOO (x) (x);
// 正确写法:FOO后紧接左括号
#define FOO(x) (x);

会提示错误
在这里插入图片描述

(2)整个宏表达式应该用括号括起来。

// 错误写法:宏表达式未加括号
#define FOO(x) (x)+1;
// 正确写法
#define FOO(x) ((x)+1);

假如我们调用

int a = 1;
int b = 3*FOO(a);

错误用法预处理后,
在这里插入图片描述
(3)宏函数参数必须加括号

// 错误写法:宏函数参数未加括号
#define FOO(x) (x*x);
// 正确写法
#define FOO(x) ((x)*(x));

假如我们调用

int a = 1;
int b = 2*FOO(a+1);

错误用法预处理后,
在这里插入图片描述
(4)使用宏函数时要警惕宏函数的多次副作用

#define FOO(x) ((x)*(x));

假如我们调用

int a = 1;
int b = FOO(++a); // 我们是想要先执行a+1,将a变为1,然后求2*2,结果为4,但实际打印结果却为9

但是预处理后,
在这里插入图片描述
(5)多语句宏函数do...while(0)

// 正确写法,直接加大括号的话,编译后会在大括号后加个分号,不符合语言规范,所以用do...while(0)
#include <iostream>
using namespace std;
#define FOO()                    \do {                         \cout << "hello" << endl; \cout << "world" << endl; \} while (0)int main() {int a = 0;if (0 == a) FOO(); // 应该不会执行,单条语句没加括号return 0;
}
//错误写法
#define FOO() cout << "hello" << endl; \cout << "world" << endl

错误用法预处理,不会打印hello但会打印world。
在这里插入图片描述
正确用法预处理
在这里插入图片描述

可以看到,宏函数使用需要注意很多地方,但是宏函数存在自有其优点。与传统函数相比,宏函数是直接替换文本,节约了函数传参,调用以及保存寄存器状态、导入寄存器之前状态的开销,大大提高了程序运行效率。

参考
bilibili-Jonases-c++


http://www.mrgr.cn/news/20954.html

相关文章:

  • 如何为 DigitalOcean 静态路由操作员设置故障转移
  • ubuntu 安装 jdk
  • php实用命令
  • 一文搞懂性能测试
  • 独立站卖家必看!一文讲清楚独立站收单及收款结汇流程
  • 企业微信群管理:构建高效沟通与协作的社群生态
  • 【深度学习】卷积神经网络与 LeNet
  • 美联储降息在即:加密市场风云再起,机遇与挑战并存
  • 监督学习、半监督学习和无监督学习
  • HTB-Pennyworth(cve查询 和 exp使用)
  • 亚马逊逆袭:我是怎么让店铺从平庸到高增长的
  • 员工上班摸鱼怎么办,上班期间摸鱼
  • 前缀和技巧
  • 伦敦银ATR策略
  • OA 考勤组操作日志查询(ecology_biz_log(操作日志表))
  • 每日一练:找到字符串中所有字母异位词
  • 微软RD客户端 手机 平板 远程控制 Windows桌面
  • 【2024国赛B题】高教杯全国大学生数学建模国赛建模过程+完整代码论文全解全析
  • ffmpeg音视频开发从入门到精通——ffmpeg下载编译与安装
  • 在 Linux 上以 All-in-One 模式安装 KubeSphere