a 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) 在使用标准 C++进行编程的时候经常会得到很多的警告信息,而这些警告信息都是不必要的提示,所以我 们可以使用#pragma warning(disable:4786)来禁止该类型的警告 在 vc 中使用 ADO 的时候也会得到不必要的警告信息,这个时候我们可以通过#pragma warning(disable:4146)来消除该类型的警告信息
六、pragma comment(...)
该指令的格式为 #pragma comment( "comment-type" [, commentstring] ) 该指令将一个注释记录放入一个对象文件或可执行文件中,comment-type(注释类型):可以指定为五种 预定义的标识符的其中一种,五种预定义的标识符为: compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略如果你为该记录类型 提供了 commentstring 参数,编译器将会产生一个警告 例如:#pragma comment( compiler )
exestr:将 commentstring 参数放入目标文件中,在链接的时候这个字符串将被放入到可执行文件中,当 操作
系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可以被 dumpbin 之 类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中
! lib:这是一个非常常用的关键字,用来将一个库文件链接到目标文件中 常用的 lib 关键字,可以帮我们连入一个库文件。 例如: #pragma comment(lib, "user32.lib") 该指令用来将 user32.lib 库文件加入到本工程中 linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设 置的链接选项,你可以指定/include 选项来强制包含某个对象,例如: #pragma comment(linker, "/include:__mySymbol") 你可以在
程序中设置下列链接选项 /DEFAULTLIB /EXPORT /INCLUDE /MERGE /SECTION
这些选项在这里就不一一说明了,详细信息请看 msdn! user:将一般的注释信息放入目标文件中 commentstring 参数包含注释的文本信息,这个注释记录将被 链接器忽略 例如: #pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )
七、#pragma data_seg
用#pragma data_seg 建立一个新的数据段并定义共享数据,其具体格式为: #pragma data_seg ("shareddata") HWND sharedwnd=NULL; #pragma data_seg() 1, #pragma data_seg()一般用于 DLL 中。也就是说,在 DLL 中定义一个共享的,有名字的数据段。 最关键的是:这个数据段中的全局变量可以被多个进程共享。否则多个进程之间无法共享 DLL 中的全局 变量。 2, 共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS 段中,从而导致多个进程之 间的共享行为失败。 3, 你所谓的结果正确是一种错觉。如果你在一个 DLL 中这么写: #pragma data_seg("MyData") int g_Value; // Note that the global is not initialized. //共享数据
#pragma data_seg() DLL 提供两个接口函数: int GetValue() { return g_Value;
} void SetValue(int n) { g_Value = n; } 然后启动两个进程 A 和 B,A 和 B 都调用了这个 DLL,假如 A 调用了 SetValue(5); B 接着调用 int m = GetValue(); 那么 m 的值不一定是 5,而是一个未定义的值。因为 DLL 中的全局数据对于每一个调 用它的进程而言,是私有的,不能共