#define <名字> <值>
-
因为这是个编译预处理指令, 所以会在编译之前的把文中的宏替换
-
值可以是什么样的(除了注释), 值里有空格, 标点符号也行也可以
-
define做的是那种最原始的文本的替换
#define FORMAT "%d\n", // 我这里的这个注释是不会被包括进值内的
int main(){
int a=20;
printf(FORMAT a);
return 0;
}
这样是成功的, 而且在编译预处理文件中, 就是完全的文本替换
- 如果一个宏的值中有其他宏的名字, 也是会被直接替换的
- 如果一个宏的值超过一行, 最后一行之前的行末需要加\
#define PRT printf(); \ /*这里来个换行*/ printf();
- 宏的值后面的注释不会被当作宏的一部分
- ""引号内的, //注释内的
没有值的宏
#define _DEBUG
不是说名字一定是这个, 只要值是空就可以
这类宏是用于条件编译的, 后面有其他的编译预处理指令来检查这个宏是否已经被定义过了
有印象: 用于大项目头文件玩的
预定义的宏
__LINE__
这个代码在的行号
__FILE__
这个代码的文件名
__DATE__
编译时候的日期
__TIME__
编译时候的时间
__STDC__
__func__
当前所在的函数名
带参数的宏 (像函数的宏)
#define cube(x) ((x)*(x)*(x))
容易出错的情况
#define RAD1(x) (x * 57.29578)
#define RAD2(x) (x) * 57.29578
int main(){
printf("%f\n", RAD1(5+2));
printf("%f\n", 180/RAD2(1));
return 0;
}
其实就是说一个纯文本替换的, 这里涉及了运算的优先级 所以
- 一切都要有括号
- 整个值要有括号
- 参数出现的每个地方都要有括号
- 也可以带多个参数
#define MIN(a,b) ((a)>(b)?(b):(a))
- 也可以组成 (嵌套) 使用其他宏