点击(此处)折叠或打开
- 
				#pragma 是 C 和 C++ 中的一个预处理指令,用于向编译器提供特定的指令或信息。GCC(GNU Compiler Collection)支持多种 #pragma 指令
 
- 
				
 
- 
				1. #pragma once 防止头文件被多次包含。
 
- 
				#pragma once
 
- 
				// 头文件内容
 
- 
				
 
- 
				2. #pragma GCC diagnostic 用于控制编译器的警告和错误信息。
 
- 
				#pragma GCC diagnostic push
 
- 
				#pragma GCC diagnostic ignored "-Wunused-variable"
 
- 
				// 可能会产生未使用变量警告的代码
 
- 
				#pragma GCC diagnostic pop
 
- 
				
 
- 
				3. #pragma pack 用于控制结构体的对齐方式
 
- 
				#pragma pack(push, 1) // 设置对齐为1字节
 
- 
				struct MyStruct {
 
- 
				    char a;
 
- 
				    int b;
 
- 
				};
 
- 
				#pragma pack(pop) // 恢复之前的对齐方式
 
- 
				
 
- 
				4. #pragma region 和 #pragma endregion 用于代码折叠(VSCODE | EditPlus | UE 支持, KEIL不支持)。
 
- 
				#pragma region MyRegion
 
- 
				// 一些代码
 
- 
				#pragma endregion
 
- 
				
 
- 
				5. #pragma omp 用于 OpenMP 并行编程。
 
- 
				#pragma omp parallel
 
- 
				{
 
- 
				    // 并行执行的代码
 
- 
				}
 
- 
				
 
- 
				其他的一些
 
- 
				#pragma message。在标准输出设备中输出指定文本信息而不结束程序运行。用法如下:
 
- 
				#pragma message(“消息文本”)。当编译器遇到这条指令时就在编译输出窗口中将“消息文本”打印出来。
 
- 
				
 
- 
				#pragma pack。用来改变编译器的字节对齐方式。常规用法为:
 
- 
				
 
- 
				#pragma pack(n) //将编译器的字节对齐方式设为n,n的取值一般为1、2、4、8、16,默认参数根据硬件平台决定
 
- 
				
 
- 
				#pragma pack(show) //以警告信息的方式将当前的字节对齐方式输出
 
- 
				
 
- 
				#pragma pack(push) //将当前的字节对齐方式放入到内部编译器栈中
 
- 
				
 
- 
				#pragma pack(push,4) //将字节对齐方式4放入到内部编译器栈中,并将当前的内存对齐方式设置为4
 
- 
				
 
- 
				#pragma pack(pop) //将内部编译器栈顶的记录弹出,并将其作为当前的内存对齐方式
 
- 
				
 
- 
				#pragma pack(pop,4) //将内部编译器栈顶的记录弹出,并将4作为当前的内存对齐方式
 
- 
				
 
- 
				#pragma pack(pop,r1) //r1为自定义的标识符,将内部编译器中的记录弹出,直到弹出r1,并将r1的值作为当前的内存对齐方式;如果r1不存在,当不做任何操作
 
- ----------------------------------------------
- 
				#pragma section
 
- 
				创建一个段。
 
- 
				
 
- 
				其格式为:#pragma section( “section-name” [, attributes] )
 
- 
				
 
- 
				多个属性间用逗号(,)隔开:
 
- 
				
 
- 
				read:可读取的
 
- 
				
 
- 
				write:可写的
 
- 
				
 
- 
				execute:可执行的
 
- 
				
 
- 
				shared:对于载入该段的镜像的所有进程是共享的
 
- 
				
 
- 
				nopage:不可分页的,主要用于Win32的设备驱动程序中
 
- 
				
 
- 
				nocache:不可缓存的,主要用于Win32的设备驱动程序中
 
- 
				
 
- 
				discard:可废弃的,主要用于Win32的设备驱动程序中
 
- 
				
 
- 
				remove:非内存常驻的,仅用于虚拟设备驱动(VxD)中
 
- 
				
 
- 
				如果未指定属性,默认属性为read和write。
 
- 
				
 
- 
				在创建了段之后,还要使用__declspec(allocate)将代码或数据放入段中。
 
- 
				
 
- 
				//pragma_section.cpp
 
- 
				
 
- 
				#pragma section(“mysec”,read,write)
 
- 
				
 
- 
				int j = 0; //j没有放入到该段
 
- 
				
 
- 
				__declspec(allocate(“mysec”))
 
- 
				
 
- 
				int i = 0; //i放入了该段中,因为使用__declspec(allocate)进行了声明
 
- 
				
 
- 
				int main(){}
 
- 
				----------------------------------------------
 
- 
				#pragma push_macro与#pragma pop_macro。前者将指定的宏压入栈中,相当于暂时存储,以备以后使用;后者将栈顶的宏出栈,弹出的宏将覆盖当前名称相同的宏
 
			#include 
#define X 1
#define Y 2
int main() {
printf("%d",X); --> 1
printf("\n%d",Y); --> 2
#define Y 3 // C4005
#pragma push_macro("Y") //Y=3被压栈了
#pragma push_macro("X") //X=1被压栈了
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
#define X 2 // C4005
printf("\n%d",X); --> 2
printf("\n%d",Y); --> 3
#pragma pop_macro("X") //X=1出栈,覆盖了{BANNED}最佳近的X=2
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
#pragma pop_macro("Y") //Y=3出站,覆盖了{BANNED}最佳近的Y=3
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
}
		#define X 1
#define Y 2
int main() {
printf("%d",X); --> 1
printf("\n%d",Y); --> 2
#define Y 3 // C4005
#pragma push_macro("Y") //Y=3被压栈了
#pragma push_macro("X") //X=1被压栈了
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
#define X 2 // C4005
printf("\n%d",X); --> 2
printf("\n%d",Y); --> 3
#pragma pop_macro("X") //X=1出栈,覆盖了{BANNED}最佳近的X=2
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
#pragma pop_macro("Y") //Y=3出站,覆盖了{BANNED}最佳近的Y=3
printf("\n%d",X); --> 1
printf("\n%d",Y); --> 3
}
- 
				----------------------------------------------
 
- 
				
 
- 
				#pragma comment(lib,“XXX.lib”)
 
- 
				表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。
 
- 
				
 
- 
				#pragma comment(linker,"/ENTRY:main_function")
 
- 
				表示指定链接器选项/ENTRY:main_function 改变程序的入口函数.
 
- 
				
 
- 
				#pragma warning(disable:4705)
 
- 
				表示屏蔽警告4705
 
- 
				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) //
