2198

11 分钟

#C 语言的预处理编译器指令 #pragma

编译器指令(#pragma)用于向编译器提供额外的信息或发出特殊的命令。格式为:

#pramga 指令

#标准指令

C 语言标准定义了以下三个指令:

指令标准说明
#pragma STDC FENV_ACCESS argC99是(ON)否(OFF)访问或修改浮点环境
#pragma STDC FP_CONTRACT argC99是(ON)否(OFF)允许对浮点表达式进行收缩,忽略舍入误差和浮点异常
#pragma STDC CX_LIMITED_RANGE argC99是(ON)否(OFF)允许复数的乘法、除法和绝对值使用简化的数学公式

#非标准指令

编译器指令(#pragma)允许编译器自定义指令,以下是被绝大多数现代编译器所支持的非标准指令。

##pragma once

#pragma once 指令写在头文件中,用于避免头文件被重复包含;该头文件被多次包含时,仅解析一次,重复的包含指令被忽略。

使用标准指令实现避免头文件被重复包含的方法为:

#ifndef LIBRARY_FILENAME_H #define LIBRARY_FILENAME_H // 头文件内容 #endif /* LIBRARY_FILENAME_H */

##pragma pack

#pragma pack 指令用于控制结构体(struct)和联合(union)类型的对齐方式。

#pragma pack(n) // 设为 n(1, 2, 4, 8, 16...)字节对齐 #pragma pack() // 设为默认的对齐方式,通常是自然对齐 #pragma pack(push) // 保存当前的对齐方式 #pragma pack(push, n) // 保存当前的对齐方式,并设为 n(1, 2, 4, 8, 16...)字节对齐 #pragma pack(pop) // 恢复之前保存的对齐方式

#推荐阅读

#参考标准

  • C23 standard (ISO/IEC 9899:2024):
    • 6.10.6 Pragma directive (p: TBD)
    • 6.10.9 Pragma operator (p: TBD)
  • C17 standard (ISO/IEC 9899:2018):
    • 6.10.6 Pragma directive (p: 127)
    • 6.10.9 Pragma operator (p: 129)
  • C11 standard (ISO/IEC 9899:2011):
    • 6.10.6 Pragma directive (p: 174)
    • 6.10.9 Pragma operator (p: 178)
  • C99 standard (ISO/IEC 9899:1999):
    • 6.10.6 Pragma directive (p: 159)
    • 6.10.9 Pragma operator (p: 161-162)
  • C89/C90 standard (ISO/IEC 9899:1990):
    • 3.8.6 Pragma directive

创建于 2025/9/3

更新于 2025/9/3