资源描述:
《C #pragma指令详解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C#pragma指令详解在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作.下面介绍了一下该指令的一些常用参数,希望对大家有所帮助! 一.message参数。message它能够在编译信息输出窗 口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为: #pragmamessage(“消息文本”) 当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有
2、正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法 #ifdef_X86 #pragmamessage(“_X86macroactivated!”) #endif 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86macroactivated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了 二.另一个使用得比较多的#pragma参数是code_seg。格
3、式如: #pragmacode_seg([[{push
4、pop},][identifier,]]["segment-name"[,"segment-class"])该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节如果code_seg没有带参数的话,则函数存放在.text节中push(可选参数)将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名pop(可选参数)将一个记录从堆栈顶端弹出,该记录可以为
5、一个标识符或者节名identifier(可选参数)当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈"segment-name"(可选参数)表示函数存放的节名例如://默认情况下,函数被存放在.text节中voidfunc1(){ //storedin.text}//将函数存放在.my_data1节中#pragmacode_seg(".my_data1")voidfunc2(){ //s
6、toredinmy_data1}//r1为标识符,将函数放入.my_data2节中#pragmacode_seg(push,r1,".my_data2")voidfunc3(){ //storedinmy_data2}intmain(){} 三.#pragmaonce(比较常用) 这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次 四.#pragmahdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。B
7、CB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。 有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragmastartup指定编译优先级,如果使用了#pragmapackage(smart_init),BCB就会根据优先级的大小先后编译。 五.#pragmawarning指令该指令允许有选择性的修改编译器的警告消息的行为指令格式如下:#pragmawarning(warning-specif
8、ier:warning-number-list[;warning-specifier:warning-number-list...]#pragmawarning(push[,n])#pragmawarning(pop)主要用到的警告表示有如下几个:once:只显示一次(警告/错误等)消息default:重置编译器的警告行为到默认状态1,2,3,4:四个警告级别disable:禁止指定的警告信息error:将指定的警告信息作为错误报告如果大家对上面的解释不是很理解,可以参考一下下面的例子及说明 #pragmawa
9、rning(disable:450734;once:4385;error:164) 等价于: #pragmawarning(disable:450734) //不显示4507和34号警告信息 #pragmawarning(once:4385) //4385号警告信息仅报告一次 #pragmawarning(error:164) //把164号警告信息作为一个错误