PS:凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。
宏定义
宏定义分为有参和午餐,一般而言无参更多用constexpr
代替
- 无参
#define 标识符 字符串// example
#define Tang Tang Panfan
- 有参
#define 宏名(形参表) 字符串// example
#define add(x+y) (x+y)
特殊操作符
define 中的特殊操作符有\,#,##,#@,… and __VA_ARGS__
- **
首先明白,宏定义一定是一行,这样就造成了可读性差,想要多行,可以
宏多行定义
#define PRINT \
{ \printf("define 1\n"); \printf("define 2\n"); \printf("define 3\n"); \
}
PS:最后一行不能加****,这是因为该符号表示将下一行链接起来;每一行最后不能加空格,否则会转义
2. #
把语言符号转化为字符串,即字符串化
直接转为字符串
#define PRINT(x) printf(#x "is val: %d\n", x)
int a = 1;
PRINT(a)
// a is val: 1#define SUM(a,b) printf(#a " + "#b" = %d\n",((a) + (b))) //宏定义,运用 # 运算符
SUM(1 + 2, 3 + 4); //宏调用
//输出结果:1 + 2 + 3 + 4 = 10
- ##
用于字符连接
#define EPS(n) (1e##-##n)
#define EPS(n) (1e-n) // 报错
- #@
字符化操作符
上面的**#**是字符串化^ _ ^ - …
__VA_ARGS__ 是一个可变参数的宏
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏__VA_ARGS__就可以被用在替换部分中,替换省略号所代表的字符串
#define PRINT(...) printf(__VA_ARGS__)
int main()
{int wt=1,sp=2;PRINT("hello\n");//输出:helloPRINT("weight = %d, shipping = %d",wt,sp);//输出:weight = 1, shipping = 2return 0;
}
取消宏
//定义宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
防止文件冲突
#ifndef __XXX__
#define __XXX__
…
文件内容
…
#endif