2.1 #define 定义标识符
语法:
#define name stuff举例子:
//#define #include<stdio.h> #define MAX1 100 #define CHAR1 "abcdefg" #define PRINT1 printf("请打印:") int main() { PRINT1; printf("MAX1:%d CHAR1:%s\n", MAX1, CHAR1);//注意常量字符串里面的不替换 return 0; }
结果如下:
这个时候我们就会有一些疑问:
在define定义标识符的时候,要不要在最后加上 ; ?
例子:#define MAX1 1000;
#define MAX2 1000
#include<stdio.h>
#define MAX1 1000;
#define MAX2 1000int main()
{
int a = MAX1;
int b = MAX2;
return 0;
}这个代码中加上:无非多了一个空语句但是还要特殊形式。
1
VS2019会直接报错 。
原因就是if后面如果没有括号只能写一天语句,可是当宏替换后多了一条空语句。
2.2 #define 定义宏
下面是宏的申明方式:
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
例子:
#define SQUARE( x ) x * x
#include<stdio.h> #define SQUARE( x ) x * x int main() { int a = SQUARE(5); printf("%d\n", a);//25 return 0; }
警告:
这个宏存在一个问题:
观察下面的代码段:
#include<stdio.h> #define SQUARE( x ) x * x int main() { int a = SQUARE(5+1); printf("%d\n", a);//36?? return 0; }
可是令人惊讶的是答案是11
原因在于宏是直接替换的 实际的计算方式是 5+1 * 5+1=11;怎样避免哪?x加个括号就可以了。
总结 :
1. 宏参数和#define 定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归。
2. 当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。
3.我们使用宏的时候,我们多加括号。