[英]Bit-fields of type other than int?
我有一个使用位域的代码,声明如下
typedef struct my{
const char *name;
uint8_t is_alpha : 1;
uint8_t is_hwaccel : 1;
uint8_t x_chroma_shift;
uint8_t y_chroma_shift;
} mystr;
uint8_t
类型定义为unsigned char
。
使用此位字段在 MS-VS 2008 中构建代码会给出如下警告:
imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
1] 使用 int 类型以外的位字段是否有任何问题/潜在问题? 为什么会有警告?
由于位域是低级的,如果您使用非标准类型,则可能存在可移植性问题。 因此警告 - 请注意,它仍然是警告而不是错误。
2] C99 C 语言规范是否允许除 int 类型以外的位文件?
来自C99的草案:
6.7.2.1 结构和联合说明符
4 位域的类型应为 _Bool、signed int、unsigned int 或其他实现定义类型的限定或非限定版本。
为什么不使用int
? 位域的实际实现因编译器而异。 如果要编写可移植代码,请使用int
。 如果你想创建一个小的结构,或者一个固定字节数的结构,或者一个位在固定位置的结构,不要使用位域。 创建一个名为flags
类的uint8_t
成员并定义宏以用作位掩码。
正如其他人提到的可移植性问题等,如果您不知道,您可以通过警告编译指示禁用警告:
https://docs.microsoft.com/en-us/cpp/preprocessor/warning?view=vs-2019
#pragma warning(push)
#pragma warning(disable: 4214) // warning C4214: nonstandard extension used: bit field types other than int
typedef struct my{
const char *name;
uint8_t is_alpha : 1;
uint8_t is_hwaccel : 1;
uint8_t x_chroma_shift;
uint8_t y_chroma_shift;
} mystr;
#pragma warning(pop)
您也可以禁用项目属性中的特定警告,但它们是项目范围的。 通过这种方式,您可以根据数据类型控制它们。
然后,如果您不确定 100% MSVC 将为这些生成什么样的二进制代码,要么在调试器中运行它并查看“反汇编视图”(中断访问它的位置),要么加载您的可执行文件(使用 PDB符号文件)中的反汇编程序,如 IDA Pro、Ghidra 等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.