五、#line 100 “jia” cout《“#line change line and filename!”《endl; //line 100 cout《__LINE__《endl; //101 cout《__FILE__《endl; //jia#pragma命令#pragma 为实现时定义的命令,它允许向编译程序传送各种指令。
+ @& Y$ t0 k) X+ ?3 C& K8 l5 A9 O% ]; v #pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
$ V8 X3 X8 \. b8 P! Q( ~ `6 ? 1、其格式一般为: #Pragma Para 1 message 参数。 ) {& C, x5 m* @( _
Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:#pragma message(“消息文本”) 9 z- W5 t( \- P3 _
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
2 a* Q; F0 _: a. G+ J2 | 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86 #pragma message(“_X86 macro activated!”)
u/ Q" V) j, y3 R) S #endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。 - O, b* M- d, Y+ _% @$ G
2、code_seg 参数。
6 O3 l' P. Z w s! U8 u0 n/ ]/ q 格式如:#pragma code_seg( [“section-name”[,“section-class”] ] ) $ |! Q& C9 k& x A2 z7 s. a
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。 / `: e, F! O; }+ ]- W
3、#pragma once (比较常用)
% N9 P8 z5 l. W 只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。 1 O! @2 A6 x- A, |9 _
4、#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 ) u* Z z4 X+ i' }, i& A
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。 & m" l2 |# |, d; S. h
5、#pragma resource “*.dfm”表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。
( |3 P! s# \/ h; o( j$ u 6、#pragma warning( disable : 4507 34; once : 4385; error : 164 )
: Q8 P8 ?- ~# b% d } 等价于:#pragma warning(disable:4507 34) /* 不显示4507和34号警告信息。如果编译时总是出现4507号警告和34号警告, 而认为肯定不会有错误,可以使用这条指令。*/ #pragma warning(once:4385) // 4385号警告信息仅报告一次#pragma warning(error:164) // 把164号警告信息作为一个错误。 : [7 I( ^8 `5 K4 @9 @4 t7 h
同时这个pragma warning 也支持如下格式:#pragma warning( push [ ,n ] ) ( y: n" f) A+ Z- _) u
#pragma warning( pop )
; [8 X; @: B" t$ m7 x; _ 这里n代表一个警告等级(1——4)。
+ h8 P. ^; r4 i. V #pragma warning( push )保存所有警告信息的现有的警告状态。
" Z& ?0 H& L$ \0 L1 m, {: u, @. J #pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n. #pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:#pragma warning( push ) & D% d* r8 u) j4 ^% \
#pragma warning( disable : 4705 ) % B% D3 e. _; _5 B2 w ~
#pragma warning( disable : 4706 )
0 j& q5 H8 t. Z$ `7 D/ j( e #pragma warning( disable : 4707 )
6 A4 s. m$ l! w' E( X //……
3 d9 Z% M6 Y) a7 s$ z; D #pragma warning( pop )
& `" W. i1 e3 Z" L$ v( W" W 在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
5 y' P7 t1 @, n* Q 7、pragma comment(……) / F/ f' F7 f5 a3 [0 M/ R
该指令将一个注释记录放入一个对象文件或可执行文件中。
a) A" \' m. b5 A. o7 M 常用的lib关键字,可以帮我们连入一个库文件。
4 v( e4 W% p4 J1 \ 8、progma pack(n)
! F, n( w& k/ B/ E/ b 指定结构体对齐方式。#pragma pack(n)来设定变量以n字节对齐方式。
" D7 H) l; L9 D7 o n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。 9 Q) J. }( o3 r: V8 v$ p+ _* d+ g
结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数; 否则必须为n的倍数。
" f6 Z/ D, |5 Q) @ 下面举例说明其用法。 #pragma pack(push) //保存对齐状态#pragma pack(4)//设定为4字节对齐struct test { char m1;double m4;int m3;};#pragma pack(pop)//恢复对齐状态为测试该功能,可以使用sizeof()测试结构体的长度! |