#C 语言的预处理编译器指令 #pragma
编译器指令(#pragma
)用于向编译器提供额外的信息或发出特殊的命令。格式为:
#pramga 指令
#标准指令
C 语言标准定义了以下三个指令:
指令 | 标准 | 说明 |
---|---|---|
#pragma STDC FENV_ACCESS arg | C99 | 是(ON )否(OFF )访问或修改浮点环境 |
#pragma STDC FP_CONTRACT arg | C99 | 是(ON )否(OFF )允许对浮点表达式进行收缩,忽略舍入误差和浮点异常 |
#pragma STDC CX_LIMITED_RANGE arg | C99 | 是(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) // 恢复之前保存的对齐方式
#推荐阅读
- Implementation defined behavior control - cppreference
- Pragmas accepted by GCC
- Pragmas in Visual Studio
#参考标准
- 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