预处理详解

本文详细介绍了C语言中的预定义符号、#define宏的机制,包括参数替换、副作用、替换规则以及宏与函数的对比。同时探讨了宏的优缺点,如效率、调试困难和类型无关性。还提到了#和##运算符的作用。
摘要由CSDN通过智能技术生成

一,预定义符号

C语言设置了一些预定义的符号,可以直接拿来使用,预定义的符号也是在与处理期间处理的。

二,#define

#define:机制包括一个规定,允许把参数替换到文本中,这种通常称为宏。

注意:参数列表的左括号必须与name紧邻,如果两者之间有任何的空白存在,参数的列表就会被解释为stuff的一部分

提示:所以用来对数值表达式进行求值的宏定义都应该加上括号,避免使用宏的时候由于参数中的操作符他们运算优先级从而输出了错误值

不加括号:

加括号:

三,带有副作用的宏参数

当宏的参数在宏的定义中出现过一次的时候,如果参数带有副作用,那你在使用宏尚未时候就可能出现危险,导致不可测的危险。

四,宏的替换规则

(1)在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果有,首先被替换。

(2)替换文本随后被插入到程序中原来为本的位置。对于宏,参数名被他们的值替换。

(3)最后,再次对文件进行扫描,看看他是否包含#define,如果有,就重复以上步骤。

注意:

(1)宏参数和#define定义中可以出现其他#difine定义的符号,但是,对于宏来说,不能出现递归。

(2)当处理器搜索#define定义的符号的时候,字符串的常量并不会被搜索。

五,宏与函数的对比

宏通常用来执行简单的运算。

(1)调用函数和函数的返回可能比实际执行的时间要长。所以,宏在时间方面更胜一筹。

(2)更为重要的是函数的参数要生命特定的类型。宏的参数是与类型无关的。

宏的劣势

(1)每次使用宏的时候,一份宏的定义代码插入到程序中,除非宏比较短,不然会大幅度增加程序。

(2)宏是无法调试的。

(3)宏由于与类型无关,也就不够严谨。

(4)宏可能会带来运算符优先级的问题。

五,#和##

#运算符将宏定义的参数转换为字符串的字面量。可以理解为“字符串的转换”。

##运算符可以把两边的符号合成一个符号,它允许宏定义从分离的文本判断创建标识符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值