用宏实现一个 比较两个数的大小,宏对比函数的优势和劣势,宏是不检查参数类型的,函数是要检查参数类型,宏是可以比较任何用大小来比较的数值,宏的运行速度相比函数,少了调用,返回,宏只是替换,所以速度会更快一些,相对函数,宏也是有劣势的,宏不能调试,也不能递归,代码替换后,会比较长,宏可能会带来运算符优先级的问题,导致程序容易出现错
#include <stdio.h>
#define COMPARY(n,m) ((n)>(m)?(n):(m))
int main()
{
printf("%d
",COMPARY(3, 2));
return 0;
}
#ifdef 和#endif 配套使用,可以实现,如果#ifdef 加宏名称 有被定义,则执行 #ifdef到#endif之间的代码,如果为假则,这中间的代码不执行,也可以跟if else if else一样多分支判断
#include <stdio.h>
#define MAX
int main()
{
//这个宏是用来判断宏名称是否有被定义,为真则执行代码,为真则不执行代码
#ifdef MAX
printf("%d
",3);
#endif
return 0;
}
//
//这个宏是跟if. else if else一样可以多分支判断的
#define COMPARY(n,m) ((n)>(m)?(n):(m))
#define MAX 4
int main()
{
#if MAX>3
printf("代码执行到这11111
");
#elif MAX<4
printf("代码执行到这22222
");
#else
printf("代码执行到这33333
");
#endif
return 0;
}
#undef
这条指令用于移除一个宏定义。
#define MAX 4
int main()
{
printf("%d
",MAX);
#undef MAX
//这个宏的功能是,从这个宏以下的关于MAx的定义都取消掉
printf("%d
",MAX);
return 0;
}
由于我们从中间取消对MAX的定义了,所以系统直接报错了。
防止头文件重复包含的宏有两种,第一种是:
#ifdef __头文件名__
#define __头文件名__
意思是如果这个头文件,已经被包含了 那他就不会再进行包含,如果没有被包含 ,那他就会执行一次包含,由于重复的包含头文件,会让代码大小变的很大,所以有必要加上防重复包含的宏
第二种是:#pragma once 这是新的防重复包含的宏,但只适用于较新的编译器,旧版本的编译器,是识别不出来的
#endif
关于头文件包含的小知识 如果我们是用<>尖括号来包含头文件的话,系统只会在库文件里面去寻找进行链接,如果是用“”双引号来包含的,系统会在代码所在的目录寻找文件,没有找到再到库文件里面去寻找。