预处理(部分)

#define宏的行为和真正的函数相比存在一些不同的地方,见下表.由于这些不同之处,所以让程序员知道一个标识符究竟是一个宏还是一个函数是丰常重要的.一没把宏名全部大写这样方便区分.
在这里插入图片描述

#undef这条预处理指令用于移除一一个宏定义.如果一个现存的名字需要被重新定义,那么它的旧定义首先必须用#undef移除.

#和##
在这里插入图片描述
条件编译
一般情况下,源涯程序中所有的行都参加编译.但有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条一般情况下,源涯程序中所有的行都参加编译.但有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”.有时,希望当满足某条条件编译功能可按不同的条件去编译不同的程序部分,从而产生不同的目标代码文件.这对于程序的移植和调试是很有用的.
.条件编译有三种形式,下面分别介绍.
#error输出用户自定义的错误消息
在这里插入图片描述

在这里插入图片描述
我们已经非常熟悉#include指令了,用来包含头文件,实际上任意文件都可以.它会把我们包含的文件全包复制到包含位置.

标准库文件包含

对于编译器已经提供好的库文件,我们可以用过下面这种语法.#include
对于flename,并不存在任何限制,不过根据约定,标准库文件以.h后缀结尾.编译器通过定义好的“库文件位置“查找头文件.

本地文件包含

对于自定义的库文件,我们可以使用下面这种语法.#include"filename”处理本地头文件首先是在源文件所在的当前目录进行查找,如果该头文件并未找到,编译器就像查找函数库头文件一样在标准位置查找本地头文件.你可以在所有的h1rntlbte泪句中使用双引号.但是,使用这种方法,编锋器在查找西数库头文件时会浪费少许时间,而且,对面数库头文件使得火括号可以—跟就香看出包含的是标液率文件还是自定灾头文件,便于区分.

在这里插入图片描述
在这里插入图片描述
#pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来.#pragma once
在头文件的最开始加入这条指令就能够保证头文件被编译一次.#pragma warning(command:错误代码)
设置警告信息状态
disable:520屏蔽520号警告信息
once:520Ⅱ仅报告一次520警告信息error:520l/把520警告作为一个错误#pragma comment(comment-type, “commentString”)
comment-type是一个预定义的标识符,指定注释的类型,一般用来加载静态库commentString是一个提供为comment-type提供附加信息的字符串.
#pragma pack()
指定对齐长度:用在结构,联合中

1.避免在无作用域限定(未用Q括起)的宏内定义数组、结构、字符串等变量,否则函数中对宏的多次引用会导致实际局部变量空间成倍放大.2.按照宏的功能、模块进行集中定义.即在一处将常量数值定义为宏,其他地方通过引用该宏,生成自己模块的宏.严禁相同含义的常量数值,在不同地方定义为不同的宏即使数值相同也不允许(维护修改后极易遗漏,造成代码隐患).3.用只读变量适当替代(类似功能的)宏,例如将#define PIE3.14改为const float PIE=3.14。这样做的好处如下:
1)预编译时用宏定义值替换宏名,编译时报错不易理解;
2)跟踪调试时显示宏值,而不是宏名;
3)宏没有类型,不能做类型检查,不安全;
4)宏自身没有作用域;
5)只读变量和宏的效率同样高.4.不带参数的宏函数也要定义成函数形式,如#define HELLO( ) printf(“Hello.”).括号会暗示阅读代码者该宏是一个函数.

1)避免空的宏定义产生warning,如#define DUMMY( ) dofwhile(O)
2)存在一个独立的代码块,可进行变量定义,实现比较复杂的逻辑处理.
3)若宏出现在判断语句之后,可保证作为一个整体来实现.
在这里插入图片描述
则以下代码就有两个问题:
在这里插入图片描述
a)因为if分支后有两条语句,else分支没有对应的if,编译失败;
b)假设没有else,则SAFE_FREE中第二条语句无论if判断是否成立均会执行,这显然违背程序设计的原始目的.那么,为了避免这两个问题,将宏直接用括起来是否可以?
如:在这里插入图片描述
的确,上述问题不复存在.但C/C+t编程中,在每条语句后加分号是约定俗成的习惯,此时以上代码的ese分支就无法通过编译(多出一个分号),而采用n…lwhie()则毫无问题.使用实. a whle()将宏包裹起来,成为一个独立的语法单元.从而不会与上下文发生洞淆.同时因为绝大多数编泽器都能够识别ldo …rnie )这种无用的循环并优化.所以该法不会导致程序的性鞋降低.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忄离殇昔逝噬石心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值