pragma 的常用用法

50阅读 0评论2024-12-06 iibull
分类:其他平台


点击(此处)折叠或打开

  1. #pragma 是 C 和 C++ 中的一个预处理指令,用于向编译器提供特定的指令或信息。GCC(GNU Compiler Collection)支持多种 #pragma 指令

  2. 1. #pragma once 防止头文件被多次包含。
  3. #pragma once
  4. // 头文件内容

  5. 2. #pragma GCC diagnostic 用于控制编译器的警告和错误信息。
  6. #pragma GCC diagnostic push
  7. #pragma GCC diagnostic ignored "-Wunused-variable"
  8. // 可能会产生未使用变量警告的代码
  9. #pragma GCC diagnostic pop

  10. 3. #pragma pack 用于控制结构体的对齐方式
  11. #pragma pack(push, 1) // 设置对齐为1字节
  12. struct MyStruct {
  13.     char a;
  14.     int b;
  15. };
  16. #pragma pack(pop) // 恢复之前的对齐方式

  17. 4. #pragma region 和 #pragma endregion 用于代码折叠(VSCODE | EditPlus | UE 支持, KEIL不支持)。
  18. #pragma region MyRegion
  19. // 一些代码
  20. #pragma endregion

  21. 5. #pragma omp 用于 OpenMP 并行编程。
  22. #pragma omp parallel
  23. {
  24.     // 并行执行的代码
  25. }

  26. 其他的一些
  27. #pragma message。在标准输出设备中输出指定文本信息而不结束程序运行。用法如下:
  28. #pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将“消息文本”打印出来。

  29. #pragma pack。用来改变编译器的字节对齐方式。常规用法为:

  30. #pragma pack(n) //将编译器的字节对齐方式设为n,n的取值一般为1、2、4、8、16,默认参数根据硬件平台决定

  31. #pragma pack(show) //以警告信息的方式将当前的字节对齐方式输出

  32. #pragma pack(push) //将当前的字节对齐方式放入到内部编译器栈中

  33. #pragma pack(push,4) //将字节对齐方式4放入到内部编译器栈中,并将当前的内存对齐方式设置为4

  34. #pragma pack(pop) //将内部编译器栈顶的记录弹出,并将其作为当前的内存对齐方式

  35. #pragma pack(pop,4) //将内部编译器栈顶的记录弹出,并将4作为当前的内存对齐方式

  36. #pragma pack(pop,r1) //r1为自定义的标识符,将内部编译器中的记录弹出,直到弹出r1,并将r1的值作为当前的内存对齐方式;如果r1不存在,当不做任何操作

  1. ----------------------------------------------
  1. #pragma section
  2. 创建一个段。

  3. 其格式为:#pragma section( “section-name” [, attributes] )

  4. 多个属性间用逗号(,)隔开:

  5. read:可读取的

  6. write:可写的

  7. execute:可执行的

  8. shared:对于载入该段的镜像的所有进程是共享的

  9. nopage:不可分页的,主要用于Win32的设备驱动程序中

  10. nocache:不可缓存的,主要用于Win32的设备驱动程序中

  11. discard:可废弃的,主要用于Win32的设备驱动程序中

  12. remove:非内存常驻的,仅用于虚拟设备驱动(VxD)

  13. 如果未指定属性,默认属性为read和write。

  14. 在创建了段之后,还要使用__declspec(allocate)将代码或数据放入段中。

  15. //pragma_section.cpp

  16. #pragma section(“mysec”,read,write)

  17. int j = 0; //j没有放入到该段

  18. __declspec(allocate(“mysec”))

  19. int i = 0; //i放入了该段中,因为使用__declspec(allocate)进行了声明

  20. int main(){}



  1. ----------------------------------------------
  2. #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
}
  1. ----------------------------------------------

  2. #pragma comment(lib,“XXX.lib”)
  3. 表示链接XXX.lib这个库,和在工程设置里写上XXX.lib的效果一样。

  4. #pragma comment(linker,"/ENTRY:main_function")
  5. 表示指定链接器选项/ENTRY:main_function 改变程序的入口函数.

  6. #pragma warning(disable:4705)
  7. 表示屏蔽警告4705
  8. 2.#pragma warning。允许有选择性的修改编译器的警告消息的行为。有如下用法:

  9. #pragma warning(disable:4507 34; once:4385; error:164) 等价于:
    1. #pragma warning(disable:4507 34) // 不显示4507和34号警告信息
    2. #pragma warning(once:4385) // 4385号警告信息仅报告一次
    3. #pragma warning(error:164) // 把164号警告信息作为一个错误
    4. #pragma warning(default:176) // 重置编译器的176号警告行为到默认状态

  10. 同时这个pragma warning也支持如下格式,其中n代表一个警告等级(1—4)

  11. #pragma warning(push) // 保存所有警告信息的现有的警告状态

  12. #pragma warning(push,n) // 保存所有警告信息的现有的警告状态,并设置全局报警级别为n

  13. #pragma warning(pop) //

上一篇:Cap'n Proto 对比 Google Protobuf
下一篇:关于放假