您的位置:首页 > 编程语言 > C语言/C++

C语言之预编译指令

2016-06-19 23:08 295 查看
宏在C中预编译指令是很重要的一个部分,所以必须要把它掌握:

预编译指令的概念

预编译指令指的是C源码在编译之前的预编译阶段需要处理的指令

预编译指令一般以#开头,可以定义在除函数体内的任何C源码位置

有以下几种预编译指令类型

文件包含指令:#include

宏定义:#define与#undef

条件编译指令:#if与#endif

宏定义

宏定义定义在函数之外,宏定义属于C语言中预编译指定的一部分

宏定义一般以#开头,有一下几种宏定义类型

#define 定义一个常量,函数或者执行代码的宏

#undef 取消之前的通过#define定义的宏,一旦宏被取消,后面的代码将不能使用这个宏

在#define与#undef范围内的所有代码段称为宏的作用范围,如果仅仅定义了#define而没有定义#undef,则该宏的作用范围从#define定义开始,一直到程序末尾

#ifdef,如果该宏已经定义,则此行到#endif之间的语句会被执行

#ifudef,如果该宏没有定义,则此行到#endif之间的语句会被执行

#endif,结束#ifdef或者#ifudef的作用范围

4,5,6常常组合起来用于防止重复包含或者重复定义引用

宏定义在预编译阶段进行的是文本替换操作,例如假设有宏定义
#define PI 3.1415926
,则会在预编译阶段把宏作用范围内的所有的PI文本替换为3.1415926,这种文本替换操作也可以叫做宏替换或者宏扩散

宏替换不会对文本的格式,标题,空格或者缩进做任何妥协,仅仅是严格按照文本做替换而已,举例:假设文本中有3PI这样的格式,则会宏替换成33.1415926,这个特点需要注意

宏定义虽然可以在一部分情况下代替常量,但是和真正的常量const定义还是有本质的区别的,但是在某些情况下,宏定义会比const更简洁高效

宏定义可以定义一个函数或者代码执行块,例如:
#define S(r) (PI * r * r);


根据4得到,宏定义只是进行机械的文本替换,所以类似与8中的宏定义,如果取消了括号定义成
#define S(r) PI * r * r;
,则有可能在运算符优先级的影响下,会进行错误的运算逻辑,所以需要加上括号,而且一般在使用宏定义函数或者代码块等除了常量之外的运算逻辑式的时候,都是需要加上括号的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: