it编程 > 编程语言 > C/C++

C语言中#pragma的用法及使用解读

23人参与 2025-10-14 C/C++

一、比较矛盾的点-#pragma到底算不算关键字

有人认为是算,而有人则认为不算。

先看反对派,反对派认为#pragma不算是c关键字的原因也很简单,即神并没有认可,那神是什么喃?即我们熟知的c89,c99,c11等协议。并没有规定或者定义#pragma。

认同派则认为反对派过于迂腐,#pragma是个老伙伴了,它为c语言立过工,它为c语言流过血,就因为协议中没有规定,就认为他不是关键字,这样很不好

二、闲话少说,看#pragma具体用法

pragma具体是指编译器使用的,即这是编译器能够识别的和其他类型的#指令是一致的。我们最常见的#include和#define和undefine是一样的。

2.1.#pragma的作用

#pragma 是 c/c++ 预处理指令之一,用来向编译器传递一些平台相关的编译控制信息。

它的特点是:

语法格式

#pragma 指令名 [参数]

2.2. 常用的#pragma示例

(1)#pragma once—— 防止头文件重复包含

#pragma once

(2)#pragma pack—— 控制结构体成员对齐方式

#pragma pack(push, 1)  // 按1字节对齐,并保存当前对齐状态
struct data {
    char a;
    int  b;
    short c;
};
#pragma pack(pop)      // 恢复之前的对齐状态

(3)#pragma message—— 编译时输出提示信息

c运行,这个就很简单,如果我们可以在代码中的任何地方添加,这样我们就能知道编译到什么地方了

#pragma message("正在编译 main.c...")

(4)#pragma warning—— 控制编译器警告

msvc 编译器

#pragma warning(disable: 4996)  // 禁用 4996 号警告
#pragma warning(once: 4820)     // 仅显示一次 4820 号警告
#pragma warning(error: 164)     // 将 164 号警告视为错误

gcc/clang 一般用 -w-werror 等命令行参数,不常用 #pragma warning

(5)#pragma comment—— 链接时加入库或其他信息(msvc)

#pragma comment(lib, "ws2_32.lib")  // 链接 winsock 库
#pragma comment(linker, "/subsystem:windows") // 设置子系统类型

(6)#pragma gcc diagnostic—— gcc 特定的警告控制

#pragma gcc diagnostic push
#pragma gcc diagnostic ignored "-wunused-variable"
    int x; // 不会产生未使用变量警告
#pragma gcc diagnostic pop

2.3. 注意事项

总结

#pragma 示例作用常见编译器支持
#pragma once防止头文件重复包含gcc, clang, msvc
#pragma pack控制结构体对齐大多数编译器
#pragma message编译时输出信息大多数编译器
#pragma warning控制警告msvc
#pragma comment链接设置msvc
#pragma gcc diagnostic控制 gcc 警告gcc, clang

✅ 结论:

三、一份不同编译器支持的常用 #pragma 指令对照表

这样在跨平台开发时就能清楚哪些可用哪些不可用。

功能msvcgcc / clangkeil (armcc)iar说明
防止头文件重复包含#pragma once#pragma once#pragma once#pragma once非标准,但现代编译器普遍支持;标准做法是 #ifndef/#define/#endif
结构体 / 联合对齐

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

#pragma pack(push, n)

#pragma pack(pop)

设置结构体成员对齐为 n 字节;n 可取 1/2/4/8/16
编译时消息输出#pragma message("text")#pragma message "text"#pragma message("text")#pragma message="text"在编译输出中显示提示信息
禁用 / 开启警告

#pragma warning(disable: 1234)

#pragma warning(default: 1234)

#pragma gcc diagnostic ignored "-wxxx"#pragma diag_suppress 1234#pragma diag_suppress=pe123临时关闭 / 恢复特定警告
警告视为错误#pragma warning(error: 1234)#pragma gcc diagnostic error "-wxxx"#pragma diag_error 1234#pragma diag_error=pe123将指定警告当作错误处理
链接选项#pragma comment(lib, "libname.lib")#pragma comment(linker, "/option")无(用 -l/-wl,option)无(用 --library/ scatter file)无(用链接器选项)向链接器传递参数或添加库
代码段 / 节区控制#pragma section("name")__declspec(allocate("name"))__attribute__((section("name")))__attribute__((section("name")))#pragma location="name"将变量 / 函数放入指定段
优化控制#pragma optimize("", off)#pragma optimize("", on)#pragma gcc push_options#pragma gcc optimize("o0")#pragma gcc pop_options#pragma optimize=none#pragma optimize=none局部关闭 / 开启优化
循环优化#pragma loop(hint_parallel(n))#pragma gcc ivdep提示编译器并行 / 向量化优化
对齐控制__declspec(align(n))__attribute__((aligned(n)))__attribute__((aligned(n)))__attribute__((aligned(n)))指定变量 / 类型对齐
内联控制__forceinline__declspec(noinline)__attribute__((always_inline))__attribute__((noinline))同上同上强制内联 / 禁止内联
中断函数__declspec(naked)无(用 __attribute__((naked)))__attribute__((naked))#pragma interrupt定义无栈帧 / 特殊中断函数

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

C++中结构体与类的使用区别及说明

10-14

C++中的结构体使用及说明

10-14

c++中的继承与派生使用详解

10-14

C++友元函数和友元类的使用详解

10-14

C++实现冒泡排序的多种方式详解

10-13

C++求圆柱体的周长的实现过程

10-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论