【发布时间】:2016-01-18 14:19:33
【问题描述】:
我有一个包含位域的结构:
struct Foo {
unsigned a : 16, b : 16;
};
我想知道我是否可以在它的位域上使用聚合初始化。例如:
struct Foo bar = {13, 42};
我注意到这是 does work in gcc 5.1 和 Visual Studio 2015。我只是想证明这是标准批准的 C 和 C++ 初始化。
【问题讨论】:
-
C 和 C++ 是不同的语言。选择一个。
-
@Olaf 我有一个 C 和 C++ 都使用的库。所以我不能选择一个,我当然希望两者的答案都是一样的。顺便说一句,gcc 对两者都适用,这是我在问题中的示例的 C 对应物:ideone.com/a3iVXw
-
@JonathanMee:“我有一个库” - 使用编译库的语言。 C 和 C++ 的语义有时存在细微差别。见上面我的一个 cmets。实际上,C 中的位域几乎没有用处。如果您必须(解)将字段打包为整数类型,只需使用位域即可;一个好的编译器会生成几乎相同的代码,但你会得到一个特定的布局。并且使用与实现相关的大小类型的位域总是一个坏主意。
-
@Olaf 我是说我正在编写的代码将用作两个独立项目中的库。一个是C++,一个是C。如果我需要把
#ifdefs放进去我可以,但在这种情况下听起来没有必要。 -
用 C 和 C++ 的相当小的通用子集编写库听起来是一种糟糕的方法。无论如何:你的项目,你的问题。
标签: c++ c initialization bit-fields aggregate-initialization