一:#pragma warning指令[zhi ling]
该指令[zhi ling]允许有选择[xuan ze]性的修改[xiu gai]编译[bian yi]器[bian yi qi]的警告消息[xiao xi]的行为
指令[zhi ling]格式[zhi ling ge shi]如下:
#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]
#pragma warning( push[ ,n ] )
#pragma warning( pop )
主要用到的警告表示有如下几个:
once:只显示[xian shi]一次(警告/错误[cuo wu]等)消息[xiao xi]
default:重置编译[bian yi]器[bian yi qi]的警告行为到默认[mo ren]状态[zhuang tai]
1,2,3,4:四个警告级别
disable:禁止指定的警告信息[xin xi]
error:将指定的警告信息[xin xi]作为错误[cuo wu]报告
如果大家对上面的解释[jie shi]不是很理解,可以参考[can kao]一下下面的例子及说明[shuo ming]
#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示[xian shi]4507和34号警告信息[xin xi]
#pragma warning(once:4385) // 4385号警告信息[xin xi]仅报告一次
#pragma warning(error:164) // 把164号警告信息[xin xi]作为一个错误[cuo wu]。
同时这个pragma warning 也支持[zhi chi]如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息[xin xi]的现有的警告状态[zhuang tai]。
#pragma warning( push, n)保存所有警告信息[xin xi]的现有的警告状态[zhuang tai],并且把全局警告
等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息[xin xi],在入栈和出栈之间所作的
一切改动取消[qu xiao]。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
#pragma warning( pop )
在这段代码[dai ma]的最后,重新保存所有的警告信息[xin xi](包括4705,4706和4707)
在使用标准C++进行编程[bian cheng]的时候经常会得到很多的警告信息[xin xi],而这些警告信息[xin xi]都是不必要的提示[ti shi],
所以我们可以使用#pragma warning(disable:4786)来禁止该类型[lei xing]的警告
在vc中使用ADO的时候也会得到不必要的警告信息[xin xi],这个时候我们可以通过
#pragma warning(disable:4146)来消除该类型[lei xing]的警告信息[xin xi]
二:#pragma pack()
注:如果设置[she zhi]的值比结构[jie gou]体中字节最长的类型[lei xing]还要大,则这个变量[bian liang](注意仅针对这一个变量[bian liang])只按照它的字节长度对齐[dui qi],即不会出现内存[nei cun]浪费的情况[qing kuang]。请参见(4)。
(1)
#pragma pack(1) //每个变量[bian liang]按照1字节对齐[dui qi]
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 1
}a;
sizeof(a)==5
(2)
#pragma pack(2) //每个变量[bian liang]按照2字节对齐[dui qi]
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 2
}a;
sizeof(a)==6
(3)
#pragma pack(4) //每个变量[bian liang]按照4字节对齐[dui qi]
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8(4)
#pragma pack() //默认[mo ren],相当于#pragma pack(8) 每个变量[bian liang]按照8字节对齐[dui qi]
struct A
{
char x; //aligned on byte boundary 0
int y; //aligned on byte boundary 4
}a;
sizeof(a)==8
但是这里y的大小是4字节,所以不会按照8字节对齐[dui qi],否则将造成1个int空间[kong jian]的浪费
三.#pragma comment
The following pragma causes the linker to search for the EMAPI.LIB library while linking. The linker searches first in the current working directory and then in the path specified in the LIB environment variable:
#pragma comment( lib, "emapi" )
四.#pragma deprecated
When the compiler encounters a deprecated symbol, it issues C4995:
void func1(void) {}
void func2(void) {}
int main() {
func1();
func2();
#pragma deprecated(func1, func2)
func1(); // C4995
func2(); // C4995
}
五.#pragma message
The following code fragment uses the message pragma to display a message during compilation:
#if _M_IX86 == 500
#pragma message( "Pentium processor build" )
#endif
六.#pragma once
防止头文件[wen jian]重复包含,主要是使头文件[wen jian]只被编译[bian yi]一次,这样就不会重复了
七.#pragma code_seg( ["section-name"[,"section-class"] ] )
它能够设置[she zhi]程序中函数[han shu]代码[dai ma]存放的代码[dai ma]段,当我们开发驱动程序[qu dong cheng xu]的时候就会使用到它。
八.#pragma resource "*.dfm"
用于[yong yu]表示把*.dfm文件[wen jian]中的资源[zi yuan]加入工程。*.dfm中包括窗体[chuang ti]外观的定义。
九、#pragma loop_opt(on/off)
用于[yong yu]激活[ji huo]或者关闭循环[xun huan]优化[you hua]
十、#pragma data_seg("seg"),新建一个节,如:
#pragma data_seg("MySec")
HWND g_hWnd = NULL;//这个变量[bian liang]是全局共享的。
#pragma data_seg()
#pragma comment(linker,"/section:MySec, RWS")//设置[she zhi]Seg为读写[du xie]共享
或者,如果在DEF模块[mo kuai]定义文件[wen jian]里
LIBRARY DLL
EXPORTS
;导出函数[han shu]。
SEGMENTS
MySec READ WRITE SHARED ;设置[she zhi]节的属性[shu xing]。