-
#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
}
-
----------------------------------------------
-
-
#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) //