我有一个使用如下声明的位字段的代码
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.
答案 0 :(得分:4)
1]使用int以外类型的位字段是否存在任何问题/潜在问题?为什么要警告?
由于位字段是低级别的,因此如果您使用的是非标准类型,则可能存在可移植性问题。因此警告 - 注意它仍然是警告而不是错误。
2] C99 C语言规范是否允许使用int类型的bit-fileds?
从C99草案:
6.7.2.1结构和联合说明符
4位字段的类型应为 合格或不合格的版本 _Bool,signed int,unsigned int或其他一些实现定义的 类型。
答案 1 :(得分:2)
为什么不使用int
?位域的实际实现因编译器而异。如果要编写可移植代码,请使用int
。如果要创建小型结构或固定字节数的结构,或者位处于固定位置的结构,请不要使用位域。创建一个名为uint8_t
的{{1}}成员,并定义用作位掩码的宏。
答案 2 :(得分:0)
正如其他人提到的有关可移植性问题等,如果您不知道,则可以通过警告编译指示禁用警告:
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等。