------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
C语言预处理总结
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。C语言提供提供了宏定义、条件编译和文件包含三种预处理指令。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。
1.预处理
1>预处理都是以#开头的
2>预处理指令主要有三种,分别是(1)宏定义
(2)条件编译
(3)文件包含
3>预处理指令在代码翻译为0,1之前执行
4>预处理指令的书写位置是随意的,但是预处理指令也有作用域,是从编写指令的那一行代码开始一直文件结束
2.宏定义
2.1 宏定义: #define 宏名 值
宏名一般大写,如#define COUNT 5
#include<stdio.h>
#define COUNT 5
int main()
{
//int ages[COUNT] = {15, 23, 27, 29, 20};
int ages[COUNT] = {14,22,23,25,11};
int i;
for(i = 0;i<COUNT;i++)
{
printf("ages[%d] = %d\n",i,ages[i]);
}
int a = COUNT;
printf("a = %d\n",a);
#undef COUNT
//int b = COUNT;
//printf("b = %d\n",b);
return 0;
}
从上面的代码可以看出,定义的宏COUNT 从#define COUNT 一直到#undef COUNT 宏是有效的。用上述的程序遍历数组,会输出全部的数组元素。在编译时,编译器会把所有的COUNT (严格意义上来说是从定义到#undef )替换为对应的值,在此处替换5。而本程序的最后两句会报错,原因是#udef之后宏定义失效,会提示未定以的变量变量COUNT。
2.2 宏定义注意
1>宏名一般用大写或者以k开头,变量名一般小写
2>宏的在作用域内,一直有效,直到文件结束或者遇到#undef标识结束
3>宏只是文本的替换并没有参与运算,在定义有参数的宏时,一定要严谨
4>带参数的宏定义执行效率高(宏在编译时直接进行文本替换,而函数实在程序运行时执行的)
<span style="font-size:18px;">#include<stdio.h>
//不严谨的宏定义 sum(2+3,1+6) *sum(2+3,1+6) ==2+3+1+6*2+3+1+6
//#define sum(a,b) a+b
#define sum(a,b) ((a)+(b))
#define squar(a) ((a)*(a))
int main()
{
int c = sum(2,5)*sum(3,5);
printf("c = %d\n",c);
int d = squar(3+5+6);
printf("d = %d\n",d);
return 0;
}</span>
3.条件编译
条件编译主要有#if 条件,#if defined (条件)#endif以及#if!def 条件 #endif.
3.1第一种条件编译指令
语法:
#if d条件1
......code.....
#elif 条件2
........code.....
..................
#elif 条件n
........code.....
#else
........code.....
#endif
最后的#endif不要漏掉,不然会包错误,提示没有}.。
错误提示如下:
03-条件编译.c: In function ‘main’: 03-条件编译.c:34:0: error: unterminated #elif #if(10==COUNT) ^ 03-条件编译.c:37:7: error: expected declaration or statement at end of input } ^
由于是预处理指令,这里的条件是宏定义。
<span style="font-size:18px;">#include<stdio.h>
#define COUNT 5
int main()
{
#ifdef COUNT
printf("hahh\n");
#endif
#ifndef COUNT
printf("Heheh\n");
#endif
/*
#if defined COUNT
printf("Haha!\n");
#endif
#if !defined COUNT
printf("Hehehe!\n");
#endif
*/
/*
//int COUNT= 10;
#if(10==COUNT)
{
printf("a = 10\n");
}
#elif(5==COUNT)
{
printf("a = 5\n");
}
#else
{
printf("a为其它值\n");
}
#endif
*/
/*
03-条件编译.c: In function ‘main’:
03-条件编译.c:34:0: error: unterminated #elif
#if(10==COUNT)
^
03-条件编译.c:37:7: error: expected declaration or statement at end of input
}
^
*/
/*
int a = 10;
if(10==a)
{
printf("a = 10\n");
}
else if(5==a)
{
printf("a = 5\n");
}
else
{
printf("a为其它值\n");
}
*/
return 0;
}</span>
3.2 #if defined MAX
......code1........
#endif
#if !defined Max
.....code2.....
#endif
假如程序中定义了宏Max则把code1编译进去,否则编译code2。
3.3 #ifdef A
...code1...
#endif
#ifndef A
.....code2.....
#endif
作用和上面的相同,定义宏编译code1,否则编译code2。
3.4条件编译使用注意
1>条件编译条件一般为宏
2>条件编译写#if后,一定要加上#endif,不然会报上述的错误
4.文件包含
4.1文件包含一般用#include指令
在C语言中,同一文件可以包含多次,会增加编译负担,可以通过和条件编译指令结合,让多次同一文件包含只编译一次。代码如下:
<span style="font-size:18px;"> #ifdef _STUD_H_
#define _STUD_H_
int sum(int a,int b);
#endif</span>
4.2文件包含注意
1>#inlcude后面 <>表示是系统自带的文件,""表示是自己定义的文件
2>不允许循环包含,如A 包含b,b又包含A