四 、条件编译命令有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。 1 S0 n x9 O5 `3 t0 ~
#if、#else,#elif及#endif #if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。 6 l, l4 e& X5 o% l$ m! b) V
#if constant-expression statement sequence #endif Eg:#define MAX 91 #include using namespace std;int main()
2 g* i; }" A) l- i& ` { #if MAX > 99 cout《“MAX is bigger than 99”《endl;#elif MAX > 90 cout《“MAX is bigger than 90”《endl;#else cout《“MAX is smaller than 90”《endl;#endif return 0;}跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。
: \7 D3 p: G) }4 j1 y M #else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。 ( a% E& R1 z$ g) H
#elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。
3 _: T2 O$ n$ Q5 k9 ?5 I #if expression statement sequence #elif expression1 statement sequence #endif / M: X' m$ G( l b' J8 P6 O
在嵌套的条件编译中#endif、#else或#elif与最近#if或#elif匹配。
u' y! j1 G( C8 ^9 a; J0 k # ifdef 和# ifndef
4 n+ H9 V8 g; J0 a' x% b. ` 条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。# ifdef的一般形式是: 1 w4 v+ ]/ Q7 X7 o e, G
# ifdef macroname statement sequence #endif $ x7 y; g- R5 e9 V, c4 M& s
#ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif. 3 M7 p1 ]% s5 e% c/ _+ H. o4 K
#define MAX 91 #include using namespace std;
$ X8 o( ? v& j, e int main()
! V: H% N0 L/ k, [ { #ifdef MAX cout《“hello,MAX!”《endl;#else cout《“where is MAX?”《endl;#endif #ifndef LEO cout《“LEO is not defined”《endl;#endif return 0;}命令#undef 取消其后那个前面已定义过有宏名定义。一般形式为:#undef macroname命令#line改变__LINE__与__FILE__的内容,它们是在编译程序中预先定义的标识符。命令的基本形式如下:#line number[“filename”]其中的数字为任何正整数,可选的文件名为任意有效文件标识符。行号为源程序中当前行号,文件名为源文件的名字。命令#line主要用于调试及其它特殊应用。注意:在#line后面的数字标识从下一行开始的数字标识。 / j, B, ?, W9 {. C/ D
五、#line 100 “jia” cout《“#line change line and filename!”《endl; //line 100 cout《__LINE__《endl; //101 cout《__FILE__《endl; //jia#pragma命令#pragma 为实现时定义的命令,它允许向编译程序传送各种指令。
+ j- H9 S- s/ p% { #pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 , S L0 k5 i8 @" ^& s# Y: D
1、其格式一般为: #Pragma Para 1 message 参数。
# N6 n3 |$ V' M Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#pragma message(“消息文本”) 6 t4 C, m1 f. K) p% \: b2 ]: s
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
3 ^1 }" H0 E" |; E: }9 J1 \ E 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86 #pragma message(“_X86 macro activated!”)
9 m2 W5 A( |, v! J6 K6 k% ?1 b #endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。
~7 r+ X% a; J/ }5 v& I' @( j* | 2、code_seg 参数。
: |+ i$ U/ Z) z' y6 k4 k' Q 格式如:#pragma code_seg( [“section-name”[,“section-class”] ] ) / P2 k! n+ b9 \6 n. k+ Y( n0 Q
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
7 p2 w% |9 t6 a5 ~3 m% O 3、#pragma once (比较常用) , f- p% B7 O% W8 `
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 # K* v2 D$ `3 z1 q
4、#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 u7 ^+ b" l, _: D
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。 |