预处理指令
在代码编译(0和1)之前执行的指令叫预处理指令。
所有的预处理指令都是以#开头。
预处理的位置是随便写的
预处理指令的作用域:从编写指令的那一行开始一直到文件结尾
#undef 宏名 从这行代码开始,宏失效
宏名一般用大写(或者在宏名前加“k”,代表常量),变量名一般用小写
一、宏定义
格式:#define 宏名 值
#define COUNT 5 //在代码编译前把所有的COUNT都换成5,除了字符串
int main()
{
int ages[COUNT]; = {1, 2, 67, 89, 90}; //数组长度值只能用常量或者宏
for(int i=0; i<COUN ; i++) //i<常量或宏,不能用变量
{
printf(“%d\n”, ages[i]);
}
return 0;
}
二、带参数的宏定义
带参数的宏定义效率比函数高
#define sum(v1, v2) ((1)+(v2)) //v1+v2应该加括号,否则会出现运算顺序问题,因为宏定义在执行时,只作文本替换,不管运算顺序
#define pingfang(a) ((a)*(a)) //应该把a括上,同样会出现运算顺序的问题
int main()
{
int a = 10;
int b = 20;
int c = sum(a, b);
int d = pingfang(10)/pingfang(2); //10*10/2*2
int e = pingfang(5+5); //5+5*5+5
printf(“c=%d, d=%d, e=%d\n”, c, d, e);
return 0;
}
三、条件编译
在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。
只要写了#if,在最后面必须加上#endif
#if 条件1
...code1...
#elif 条件2
...code2...
#else
...code3...
#endif
eg:
#define A 10
int main()
{
int a = 10;
#if (A == 10)
printf(“a是10\n”);
#elif (A == 5)
printf(“a是5\n”);
#else
printf(“a是其他值\n”);
#endif //必须写endif,因为如果没有结束if的标志,会导致以后的代码都不执行编译
return 0;
}
----------------------------------------------------------------------------------------------------------------
#if defined(MAX) //如果定义了MAX这个宏
...code...
#endif
#if !defined(MAX) //如果没有定义MAX这个宏
...code...
#endif
//同上
#ifdef MAX
...code...
#endif
#ifndef MAX
...MAX...
#endif
四、文件包含
1.<>表示系统自带的文件,""表示自定义的文件
2.不允许 循环包含,比如a.h包含b.h,b.h包含a.h
开发中常常出现多次重复包含同一头文件的情况,这样会降低编译效率,为了防止这一情况,可以再头文件中定义条件编译:
test.h
#ifndef TEST.H //这个宏通常定义为大写的文件名,定义为空即可,防止不同的头文件定义相同的宏
#define TEST.H
函数声明code
#endif
|