12..条件编译
条件编译的功能使得我们可以按不同的条件去编译不同的程序部分,因而产生不同的目
标代码文件。这对于程序的移植和调试是很有用的。条件编译有三种形式,下面分别介绍:
第一种形式:
#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阶梯状语句,可进行多种编译选择。
13..#pragma预处理
在所有的预处理指令中,#pragma指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。
依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #pragma para 其中para为参数,下面来看一些常用的参数。
1..message参数:当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
#pragma message(“消息文本”)
假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#pragma message (“_X86 macro activated!”)
#endif
2.. #pragma code_seg
另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg(["section-name"[,"section-class"]])
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
3.. #pragma once
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在
VisualC++6.0中就已经有了,但是考虑到兼容性并没有太多的使用它。
4.. #pragma comment
#pragma comment(...) 该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。比如:
#pragma comment(lib,"user32.lib")
该指令用来将user32.lib库文件加入到本工程中。
linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或
者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象,例如:
#pragma comment (linker, "/include:__mySymbol")
5.. #pragma hdrstop
#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以
预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,
所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。
你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init),BCB
就会根据优先级的大小先后编译。
6..#pragma resource
#pragma resource"*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。
7.. #pragma warning
8.. #pragma pack (研究内存对齐知识)