为何Clang禁止匿名位域使用限定符?如何消除该错误?
问题分析与解决
问题重现
测试代码:
struct{ const int : 1; const int b : 1; } bit = {0}; int main(void) { return bit.b; }
多数编译器(含最新版GCC)可正常编译这段代码,但Clang 8及以上版本会报错:
[source]:2:22: error: anonymous bit-field cannot have qualifiers const int : 1;
使用volatile限定符时也会触发相同错误。
Clang严格限制的原因
Clang的这个行为是严格遵循C语言标准的结果:匿名位域没有标识符,程序中无法直接访问或修改它,而const/volatile这类限定符的作用是约束对象的读写行为或内存可见性,对匿名位域来说完全没有意义——既然根本无法访问,限定符就成了冗余的语法错误。
GCC允许这种写法属于编译器扩展,并非标准C的范畴。Clang从8版本开始收紧了对标准的遵循,将这类冗余语法判定为错误,避免代码中出现无意义的写法。
消除错误的方法
由于你的硬件寄存器头文件是自动生成的,无法手动删除匿名位域的限定符,可通过以下方式解决:
- 使用Clang的编译选项**
-Wno-anonymous-bitfield-qualifiers**,该选项会关闭匿名位域限定符的错误检查,让编译器接受这类写法。 - 如果代码需要兼容MSVC风格的扩展,也可以尝试添加**
-fms-extensions**选项,不过前者是更精准的解决方案。
内容的提问来源于stack exchange,提问作者Dmitry Grigoryev
相关产品推荐
相关产品推荐

