【发布时间】:2011-05-16 20:59:52
【问题描述】:
我不太确定 C,但 C++ 允许长度为 0 的未命名位域。例如:
struct X
{
int : 0;
};
- 问题一:你能想到什么实际用途?
- 问题二:您知道哪些实际用途(如果有)?
编辑冰罪回答后的例子
编辑: 好的,感谢当前的答案,我现在知道了理论目的。但是问题是关于实际用途的,所以它们仍然成立:)
【问题讨论】:
-
C99 允许零长度数组更好地支持动态大小的结构。
-
@roe:是的,嗯,它相当于 0 长度的动态分配数组,非常有用。我认为这里的问题是位域长度必须是编译时常量。
-
@roe:您的评论不正确。 C 不允许
char a[0];在任何版本的标准中。另一方面,char a[];在 C99 的结构中是允许的;它称为灵活数组成员,必须出现在末尾。char a[];不是“char a[0];的简写”。 -
@R,我错了;使用零是 GCC 特定的扩展。从技术上讲,它仍然是一个零长度数组,尽管最初的问题是不可能的。我知道它必须在结构的末尾(其他任何地方都没有任何意义)。
-
@R: 太糟糕了 C 要求数组具有非零大小,因为最常见的 hack 流行解决了禁止零大小数组的问题,这会阻止编译器制作一些其他有用的东西优化。例如,如果 struct foo 以“int bar[1]”结尾,则表达式“foo.bar[i]”可以合法地替换为“foo.bar[0]”,这可以在编译时进行评估(因为任何其他“i”的值将调用未定义的行为)。当然,struct hack 非常普遍,任何利用这种优化的编译器都会破坏现实世界的代码。
标签: c++ c bit-fields