解析#pragma命令<二>

   #pragma 预处理   在全部的预处理指令中,#Pragma 指令多是最复杂的了,它的做用是设定编译器的状态或者是指示编译器完成一些特定的动做。#pragma指令对每一个编译器给出了一个方法,在保持与C和C++语言彻底兼容的状况下,给出主机或操做系统专有的特征。依据定义,编译指示是机器或操做系统专有的,且对于每一个编译器都是不一样的。   其格式通常为: #Pragma Para   其中Para 为参数,下面来看一些经常使用的参数。   (1)message 参数。 Message 参数是我最喜欢的一个参数,它可以在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是很是重要的。其使用方法为:   #Pragma message(“消息文本”)   当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。   当咱们在程序中定义了许多宏来控制源代码版本的时候,咱们本身有可能都会忘记有没有正确的设置这些宏,此时咱们能够用这条指令在编译的时候就进行检查。假设咱们但愿判断本身有没有在源代码的什么地方定义了_X86这个宏能够用下面的方法   #ifdef _X86   #Pragma message(“_X86 macro activated!”)   #endif   当咱们定义了_X86这个宏之后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated!”。咱们就不会由于不记得本身定义的一些特定的宏而抓耳挠腮了。   (2)另外一个使用得比较多的pragma参数是code_seg。格式如:   #pragma code_seg( ["section-name"[,"section-class"] ] )   它可以设置程序中函数代码存放的代码段,当咱们开发驱动程序的时候就会使用到它。   (3)#pragma once (比较经常使用)   只要在头文件的最开始加入这条指令就可以保证头文件被编译一次,这条指令实际上在VC6中就已经有了,可是考虑到兼容性并无太多的使用它。   (4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB能够预编译头文件以加快连接的速度,但若是全部头文件都进行预编译又可能占太多磁盘空间,因此使用这个选项排除一些头文件。   有时单元之间有依赖关系,好比单元A依赖单元B,因此单元B要先于单元A编译。你能够用#pragma startup指定编译优先级,若是使用了#pragma package(smart_init) ,BCB就会根据优先级的大小前后编译。   (5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。   (6)#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号警告信息做为一个错误。   同时这个pragma warning 也支持以下格式:   #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)。   (7)pragma comment(...)   该指令将一个注释记录放入一个对象文件或可执行文件中。   经常使用的lib关键字,能够帮咱们连入一个库文件。   每一个编译程序能够用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:   #pragma loop_opt(on) // 激活   #pragma loop_opt(off) // 终止   有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”,能够这样:   #pragma warn —100 // Turn off the warning message for warning #100   int insert_record(REC *r)   { /* function body */ }   #pragma warn +100 // Turn the warning message for warning #100 back on   函数会产生一条有惟一特征码100的警告信息,如此可暂时终止该警告。   每一个编译器对#pragma的实现不一样,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。
相关文章
相关标签/搜索