目录
#define
概念
#define之所以叫预处理指令,是因为这串指令是在预处理阶段起作用的
语法
#define 宏名称 替换文本
其中:
宏名称
是你为宏定义的标识符,通常以全写大写字母表示,用以和普通变量名区分开来。替换文本
是你想要替换成的代码片段,可以是表达式、语句、或者其他代码片段。
用法一:直接替换内容
例如:
#define MAX 100 //一般用全大写来命名
#define STR "abcdef"
#define INT int
#define ANV 3+5
int main()
{
int max = MAX;
char arr[] = { STR };
INT x = 1;
INT y = ANV * 2;
printf("%d\n", max);
printf("%s\n", arr);
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
被定义的标识符会在预处理(预编译)阶段完完全全替换
注意点
- #define后面不跟分号(;),因为#define的机制是直接替换,如果加上分号的话,连分号也会一起被替换过去
- #define定义标识符存在安全隐患,例如上图的ANV,原本int y 的值是2*8 = 16,但因为#define原封不动替换,所以就会变成3+5*2 = 13,因为运算符优先级而导致出错,所以,如果要用#define来标识表达式,要加上括号
用法二:替换带有参数的宏
概念:
#define除了可以标识一些常规的值,还可以标识一些可以让自己传参的值(像函数那样玩)
这种实现被称为宏或者定义宏
例子:
#define ADD(x, y) x+y
int main()
{
int sum = ADD(3, 4) * 2;
return 0;
}
注意点
①在 #define ADD(x, y) x+y 中,左括号必须要紧挨着ADD,否则会被以为是第一种用法(定义标识符)
②定义宏和定义标识符一样,都存在安全隐患,可能会导致和原本的代码逻辑相悖,也应该要加上括号,改为:#define ADD(x, y) ((x) + (y))
ps:因为x和y有可能不只是一个值,有可能是一个表达式,所以x和y也要单独用括号括起来
预定义符号
概念:这是语言内置的符号,在预处理环节会自动替换掉
以下为部分预定义符号:
- __FILE__ :当前编译的源文件路径
- __LINE__ :当前的行号
- __DATE__ :当前的日期
- __TIME__ :当前文件被编译的时间
- __STDC__ :判断当前编译器是否遵守ANSI C的规则,如果遵守就替换成1,否则替换成0
- __FUNCTION__ :替换成这个预定义符号所在的函数的名字(例如:main)
左侧为预处理之前,右侧为预处理之后
↓↓↓