详解C语言之预处理(下)
作者:iEucliwood
#define定义宏带副作用的宏参数
我们来看如下一段代码
结果分别为12,11,13
当参数替换后,首先判断表达式 (a++)>(b++)?,判断后a的值加1 b的值加1,然后执行表达式(b++)此时执行的值为12,执行完成后b的值加1,则a的值为11,b的值为13。可以看出对于这种情况下的宏是带有副作用的,可能会导致不可预料的结果
#define定义宏的优点
实现以下代码,用函数好还是宏好?
1.用于调用函数和返回代码的时间可能比这个小型计算所需的时间更多,所以宏在速度上和规模上更胜一筹
2.函数的参数必须声明为特定的类型,所以函数只能在类型合适的表达式使用,而宏则与类型无关,所以如果比较浮点型时使用函数就会有警告
#define定义宏劣势
1.每次使用宏时,一段宏定义的代码会插入到代码中,除非宏比较短,否则将大幅增加代码的长度
2.由于存在信息差,宏是没办法调试的。我们看到的是宏定义的名字,而实际运行是宏定义的代码。例:
看似代码没错,但实际上是因为无法调试宏而找不出错误。
3.宏由于与类型无关,也就不够严谨
4.宏可能带来运算符优先级的问题,容易导致结果出错
预处理
预定义符号
__FILE__
进行编译的源文件
__DATE__
文件被编译的日期
__TIME__
文件被编译的时间
__LINE__
文件当前的行号
__STDC__
若编译器遵循ANSI C标准 则值为1,否则未定义
预处理指令
#define
宏定义
#undef
撤销已定义宏名
#include
使编译程序将另一源文件嵌入到带有#include的源文件中
#ifdef
如果定义
#ifndef
如果未定义
#endif
预处理指令为上述以及其他#开头的指令
条件编译
能够让语句选择编译或者放弃
常用于调试性的代码,删除可惜,保留又碍事,或者防止重复头文件多次编译
1.调试性代码
若未定义,则不会编译其中的代码
2.防止重复的头文件多次编译
还可以用#pragma once
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!