#pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令:
#pragma comment(lib,"XXX.lib")
表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。
#pragma comment(linker,"/ENTRY:main_function")
表示指定链接器选项/ENTRY:main_function
#pragma once
表示这个文件只被包含一次
#pragma warning(disable:4705)
表示屏蔽警告4705
C和C++程序的每次执行都支持其所在的主机或操作系统所具有的一些独特的特点。例如,有些程序需要精确控制数据存放的内存区域或控制某个函
数接收的参数。#pragma为编译器提供了一种在不同机器和操作系统上编译以保持C和C++完全兼容的方法。#pragma是由机器和相关的操作系统定义
的,通常对每个编译器来说是不同的。
如果编译器遇到不认识的pragma指令,将给出警告信息,然后继续编译。Microsoft C and C++ 的编译器可识别以下指令:alloc_text,
auto_inline,bss_seg,check_stack,code_seg,comment,component,conform,const_seg,data_seg,deprecated,
fenv_access,float_control,fp_contract,function,hdrstop,include_alias,init_seg,inline_depth,inline_recursion,intrinsic,
make_public,managed,message,omp,once,optimize,pack,pointers_to_members,pop_macro,push_macro,region,
endregion,runtime_checks,section,setlocale,strict_gs_check,unmanaged,vtordisp,warning。其中conform,init_seg,
pointers_to_members,vtordisp仅被C++编译器支持。
以下是常用的pragma指令的详细解释。
1.#pragma once。保证所在文件只会被包含一次,它是基于磁盘文件的,而#ifndef则是基于宏的。
2.#pragma warning。允许有选择性的修改编译器的警告消息的行为。有如下用法:
#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(default:176) // 重置编译器的176号警告行为到默认状态
同时这个pragma warning也支持如下格式,其中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)。
3.#pragma hdrstop。表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以 加快链接的速度,但如果所有头文件都进
行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文 件。
4.#pragma message。在标准输出设备中输出指定文本信息而不结束程序运行。用法如下:
#pragma message("消息文本")。当编译器遇到这条指令时就在编译输出窗口中将“消息文本”打印出来。
5.#pragma data_seg。一般用于DLL中,它能够设置程序中的初始化变量在obj文件中所在的数据段。如果未指定参数,初始化变量将放置在默认数
据段.data中,有如下用法:
1: #pragma data_seg("Shared")