除int之外的其他类型的位域?

时间:2010-02-17 12:24:58

标签: c bit-fields

我有一个使用如下声明的位字段的代码

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_tunsigned char的类型定义。

使用此位字段在MS-VS 2008中构建代码会发出如下警告:

imgconvert.c(60) : warning C4214: nonstandard extension used : bit-field types other than int.
  1. 使用int以外类型的位字段是否存在任何问题/潜在问题?为什么要警告?
  2. C99 C语言规范是否允许使用int类型的bit-fileds?

3 个答案:

答案 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等。