繁体   English   中英

不是 int 类型的位域?

[英]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 类型的位文件之外的其他位文件?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM