如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
预处理命令详解在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。1.#pragmamessage指令message能够在编译消息输出窗口中输出相应的消息,这对于源代码信息的控制非常重要的。格式如下:#pragmamessage(“消息文本”)编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的候进行检查,假设我们希望判断自己有没有源代码的什么地方定义了_X86这个宏可以用下面的方法:#ifdef_x86#pragmamessage("_x86macroactivated!")#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_x86macroactivated!"。2.#pragmacode_seg指令格式如下:#pragmacode_seg([[{push|pop},][identifier,]]["segment-name",]["segment-class"])该指令用来指定函数在.obj文件中存放的节,观察.obj文件可以使用VC自带的dumpbin命令行程序,函数在.obj文件中默认的存放节为.text节。(1)如果code_seg没有带参数的话,则函数存放在.txt节中;(2)push(可选参数):将一个记录放到内部编译器的堆栈中,可选参数(记录名)可以为一个标识符或者节名;pop(可选参数)将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名;(3)identifier(可选参数):当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈;(4)"segment-name"(可选参数):表示函数存放的节名;例如://默认情况下,函数被存放在.txt节中voidfunc1(){//storedin.txt}//将函数存放在.my_data1节中#pragmacode_seg(".my_data1")voidfunc2(){//storedinmy_data1}//r1为标识符,将函数放入.my_data2节中#pragmacode_seg(push,r1,".my_data2)voidfunc3(){//storedinmy_data2}intmain(){}3.#pragmaonce指令格式如下:#pragmaonce这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件只被被编译一次。(1)#pragmaonce是编译相关的,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。(2)#ifndef/#define/#endif是C++语言相关的,它是通过C++语言中的宏定义来避免头文件被多次编译的。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式。关于#pragmaonce和#ifndef/#define/#endif的详细区别参见8.。4.#pragmahdrstop指令格式如下:#pragmahdrstop它表示预编译头文件到此为止,后面的头文件不进行预编译。BCB(BorlandC++Builder)可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragmastartup指定编译优先级,如果使用了#pragmapackage(smart_init),BCB就会根据优先级的大小先后编译。5.#pragmawarning指令格式如下:#pragmawarning(warning-specifier:warning-number-list[;warning-specifier:warning-number-list...]#pragmawarning(push[,n])#pragmawarning(pop)主要用到的警告表示有如下几个:once:只显示一次(警告/错误等)消息;default:重置编译器的警告行为到默认状态;1,2,3,4:四个警告级别;disable:禁止指定的警告信息;error:将指定的警告信息作为错误报告。【例示】#pragmawarning(disable:450734;once:4385;error:164