ef:#define在预处理阶段替代所有的Max
#define Max 100
int main()
{
printf("%d\n", Max);
system("pause");
return 0;
}
define定义标识符的时候,不要轻易在最后加;可能造成语法错误。
eg:
#define Max 100;
int main()
{
int max = 0;
if (1)
{
max = Max;
}
else
max = -1;
system("pause");
return 0;
}
#defien 机制包括一个规定,允许把参数替换到文本中,这个实现通常成为宏。
下面是宏的申明方式:
#define name( a ) stuff
其中a是一个由逗号隔开的符号表,它们可能出现在stuff中
注意
参数列表的左括号必须与name紧邻
eg:
#include
#include
#include
#include
#define MAX(X,Y) X>Y?X:Y
int main()
{
int a = 10;
int b = 20;
int max = MAX(a, b);
printf("%d", max);
system("pause");
return 0;
}
下面代码想输出64却不行思考解决方法:
#define MAX(X,Y) X>Y?X:Y
#define S(x) x*x
int main()
{
int a = 10;
int b = 20;
int max = S(3+5);
printf("%d", max);
system("pause");
return 0;
}
解决方法:在宏定义的两边加上一对括号,如下
#define MAX(X,Y) X>Y?X:Y
#define S(x) (x)*(x)
int main()
{
int a = 10;
int b = 20;
int max = S(3+5);
printf("%d", max);
system("pause");
return 0;
}
所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数中的操作符或临近操作符之间不可预料的相互作用;
1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替代
2.替代文本随后被插入到程序中原本文本的位置,对于宏,参数名被它们的值替代。
3.最后,再次对结果文件进行扫描,看看它是否包含任何由#define定义的服符号,如果是,就重复上述的处理过程
注意
eg:
#define Print(val,format) printf("the value of "#val" is "format, val)
int main()
{
int a = 9;
Print(a, "%d");
system("pause");
return 0;
}
eg:
#define Cat(x,y) x##y
int main()
{
int test38 = 10;
printf("%d\n", Cat(test, 38));
system("pause");
return 0;
}
输出结果为10;
这个预处理指令用于移除一个指定的宏定义
格式:#undef NAME
有时候宏和函数可以完成相同的功能
还有一些代码是使用函数无法实现的比如下面这个动态分配空间使用函数是无法实现的:
#include
#define MALLOC(a, type) \
((type*)malloc((a)*sizeof(type)))//动态申请了10个type类型的空间
int main()
{
int *p = MALLOC(10, int); //給指针p动态分配了10个int类型的空间
free(p);
return 0;
}
因为宏的第二个参数是一个类型,类型可以作为宏的参数进行传递,不可以作为函数的参数进行传递。