本文主要是介绍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++
这篇关于2、#include和#define的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!