按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#define
X
3
#define
Y
X*2
#undef
X
#define
X
2
intz=Y;
z的值为多少?
3。2,条件编译
条件编译的功能使得我们可以按不同的条件去编译不同的程序部分,因而产生不同的目
标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍:
第一种形式:
#ifdef标识符
程序段
1
#else
程序段
2
#endif
它的功能是,如果标识符已被
#define命令定义过则对程序段
1进行编译;否则对程序段
2
进行编译。如果没有程序段
2(它为空),本格式中的#else可以没有,即可以写为:
#ifdef标识符
程序段
#endif
第二种形式:
#ifndef标识符
程序段
1
#else
程序段
2
#endif
与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定
义过则对程序段
1进行编译,否则对程序段
2进行编译。这与第一种形式的功能正相反。
第三种形式:
#if常量表达式
程序段
1
#else
程序段
2
#endif
它的功能是,如常量表达式的值为真
(非
0),则对程序段
1进行编译,否则对程序段
2进行
编译。因此可以使程序在不同条件下,完成不同的功能。
至于#elif命令意义与
elseif相同,它形成一个
if
else…if阶梯状语句,可进行多种编译选择。
3。3,文件包含
文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编
译,结果将生成一个目标文件。C语言提供
#include命令来实现文件包含的操作,它实际是
宏替换的延伸,有两种格式:
格式
1:
#include
其中,filename为要包含的文件名称,用尖括号括起来,也称为头文件,表示预处理到
系统规定的路径中去获得这个文件(即
C编译系统所提供的并存放在指定的子目录下的头
文件)。找到文件后,用文件内容替换该语句。
格式
2:
#include“filename”
其中,
filename为要包含的文件名称。双引号表示预处理应在当前目录中查找文件名为
filename的文件,若没有找到,则按系统指定的路径信息,搜索其他目录。找到文件后,用
文件内容替换该语句。
需要强调的一点是:#include是将已存在文件的内容嵌入到当前文件中。
另外关于#include的路径也有点要说明:include支持相对路径,格式如
trackant(蚁迹寻
踪)所写:
。代表当前目录,。。代表上层目录。
3。4,#error预处理
#error预处理指令的作用是,编译程序时,只要遇到
#error就会生成一个编译错误提
示消息,并停止编译。其语法格式为:
#error
error…message
注意,宏串
error…message不用双引号包围。遇到
#error指令时,错误信息被显示,可能同时
还显示编译程序作者预先定义的其他内容。关于系统所支持的
error…message信息,请查找
相关资料,这里不浪费篇幅来做讨论。
3。5,#line预处理
#line的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符
命令的基本形式如下:
#linenumber'〃filename〃'
其中''内的文件名可以省略。
例如:
#line30
a。h
其中,文件名
a。h可以省略不写。
这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号
为
30,文件名是
a。h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译
器的编写中,我们知道编译器对
C源码编译过程中会产生一些中间文件,通过这条指令,
可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。
3。6,#pragma预处理
在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的
状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法;
在保持与
C和
C++语言完全兼容的情况下;给出主机或操作系统专有的特征。依据定义
;编译
指示是机器或操作系统专有的;且对于每个编译器都是不同的。
其格式一般为:
#pragma
para
其中
para为参数,下面来看一些常用的参数。
3。6。1,#pragma
message
message参数:Message参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#pragmamessage(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有
正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判
断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef
_X86
#Pragma
message(“_X86
macroactivated!”)
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_
X86
macroactivated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了
。
3。6。2,#pragma
code_seg
另一个使用得比较多的
pragma参数是
code_seg。格式如:
#pragma
code_seg('〃section…name〃';〃section…class〃'')
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
3。6。3,#pragma
once
#pragma
once(比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在
VisualC++6。0中就已经有了,但是考虑到兼容性并没有太多的使用它。
3。6。4,#pragma
hdrstop
#pragma
hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以
预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,
所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元
A依赖单元
B,所以单元
B要先于单元
A编译。
你可以用#pragma
startup指定编译优先级,如果使用了#pragma
package(smart_init),BCB
就会根据优先级的大小先后编译。
3。6。5,#pragma
resource
#pragma
resource〃*。dfm〃表示把*。dfm文件中的资源加入工程。*。dfm中包括窗体
外观的定义。
3。6。6,#pragma
warning
#pragma
warning(
disable:
4507
34;once:
4385;error
:
164
)
等价于:
#pragma
warning(disable:4507
34)//不显示
4507和
34号警告信息
#pragma
warning(once:4385)
//
4385号警告信息仅报告一次
#pragma
warning(error:164)
//把
164号警告信息作为一个错误。
同时这个
pragmawarning也支持如下格式:
#pragma
warning(push';n')
#pragma
warning(pop)
这里
n代表一个警告等级(1…4)。
#pragma
warning(push)保存所有警告信息的现有的警告状态。
#pragma
warning(push;n)保存所有警告信息的现有的警告状态,并且把全局警告
等级设定为
n。
#pragma
warning(pop)向栈中弹出最后一个警告信息,在入栈和出栈之间所作的
一切改动取消。例如:
#pragma
warning(push)
#pragma
warning(
disable:
4705
)
#pragma
warning(
disable:
4706
)
#pragma
warning(
disable:
4707
)
//。。。。。。。
#pragma
warning(
pop)
在这段代码的最后,重新保存所有的警告信息(包括
4705,4706和
4707)。
3。6。7,#pragma
ment
#pragma
ment(。。。)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的
lib关键字,可以帮我们连入一个库文件。比如: