编译器指令(#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 指令写在头文件中,用于避免头文件被重复包含;该头文件被多次包含时,仅解析一次,重复的包含指令被忽略。
使用标准指令实现避免头文件被重复包含的方法为:
#ifndef LIBRARY_FILENAME_H
#define LIBRARY_FILENAME_H
// 头文件内容
#endif /* LIBRARY_FILENAME_H */
#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