文章目录
#define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。
#define 是预处理命令,因此会在预处理阶段被执行
因为#define是预处理命令,可以在预处理阶段看到结果,预处理命令
gcc -E demo.c -o demo.i
0x1无参宏定义
0x10常见无参宏定义
#define 标识符[替换字符] 字符串[被替换字符]
#define FLAG 1
#define SET_BIT_MASK 0x1
#define UNSET_BIT_MASK 0x0
0x11宏定义用于条件编译
在大规模的开发过程中,头文件很容易发生嵌套包含,可以使用#ifndef 配合 #define ,#endif 。
功能与 #pragma once 作用类似,都是为了防止多次编译一个头文件。
#ifndef COMPILE_H
#define COMPILE_H
...
#endif
0x12宏定义用于跨平台
跨平台和系统的软件里,可以在编译的时候通过#define设置编译环境
#ifdef WINDOWS
......
(#else)
......
#endif
#ifdef LINUX
......
(#else)
......
#endif
0x13 define用于定义别名【糟糕的用法】
0x131 定义变量
#include "iostream"
using namespace std;
#define intPtr int * //定义一个 int * 指针类型
int main() {
intPtr x = new int(6);
cout << x << " " << *x << endl;
system("pause");
return 0;
}
歧义
define是宏定义,宏定义的处理阶段是预处理,其作用是简单的替换,根据替换结果再进行分析,发现歧义
intPtr y, z;
//实际替换结果:int * y,z;
0x132 定义函数
#include "iostream"
using namespace std;
void func() {
cout << "hello " << endl;
}
#define PRINTHELLO func
int main() {
PRINTHELLO();
system("pause");
return 0;
}
0x2 有参宏定义
C++语言允许宏带有参数。
函数式宏是最有歧义的地方,经常与函数对比
- 不进行类型检查:宏在预处理阶段进行替换
- 多次替换可能导致代码体积增大:由于宏是通过文本替换实现的,如果在一个代码中使用多次,可能会导致生成的代码体积显著增大
- 调试困难:由于宏在预处理阶段就已经展开,调试时难以准确追踪宏的调用和执行过程,增加了调试的难度
- 可能引入副作用:由于宏在预处理阶段进行文本替换,如果宏内部包含有副作用的操作(如自增、自减);尤其是在变量在嵌套使用时,有可能会引入歧义
0x21 常见有参宏定义
#define 宏名(形参表) 字符串
#define ADD(x,y) (x+y)
#define SQR(x) ((x)*(x))
0x22 有参宏替换【小括号问题】
int a = 10;
#define SQUARE(X) (X * X) // 不推荐,这样做只是方便理解,建议带小括号
// SQUARE(a + 2)
// val = (a + 2 * a + 2)
#define SQUARE(X) ((X) * (X)) // 推荐
// SQUARE(a + 2)
// val = ((a + 2) * (a + 2))
0x23 有参宏替换【字符化操作】
’#‘ 作用是将宏定义参数不经任何扩展地转换成字符串常量,所谓拓展包括:
宏定义参数的两边的空格会被忽略;
特殊字符会被加上转义字符;
#define ARG1 abc
#define ARG2 def
#define PLUS(X, Y) X#Y
// PLUS(ARG1, ARG2)
// ARG1#ARG2
// abcARG2
0x24 有参宏替换【标记连接操作】
’##‘ 的作用是在宏定义中,将两个部分连接成一个部分,需要注意:
用于连接,所以不能用在首尾;
其前后的空格无意义;
#define PLUS(X, Y) X##Y
// PLUS(AAA, BBB)
// AAABBB
// 例子
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
cout << FB(F B);
/*
FB(F B)
#F B
F B
*/
cout << FB1(F B);
/*
FB1(F B);
FB(F B)
FB(abc def)
#abc def
abc def
*/