2、#include和#define

一、#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 5

int 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++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值