C++不支持在结构体末尾使用C99灵活数组成员,无论是使用空索引符号还是0
索引符号(除了一些特定于厂商的扩展):
struct blah
{
int count;
int foo[];
};
struct blah
{
int count;
int foo[0];
};
据我所知,C++0x 也不会添加这个功能。
不过,如果你将数组大小调整为 1 个元素:
struct blah
{
int count;
int foo[1];
};
这段代码可以编译并且运行良好,但从技术上讲它是未定义的行为。您可以使用一个表达式来分配适当的内存,这个表达式不太可能出现一位误差:
struct blah* p = (struct blah*) malloc( offsetof(struct blah, foo[desired_number_of_elements]);
if (p) {
p->count = desired_number_of_elements;
}
因此,它可以在C90、C99和C++之间进行移植,并且与C99的灵活数组成员一样有效。
Raymond Chen对此进行了很好的阐述:为什么有些结构以大小为1的数组结尾?
注意:在Raymond Chen的文章中,有一个打印错误/bug在初始化“灵活”数组的示例中。应该这样写:
for (DWORD Index = 0; Index < NumberOfGroups; Index++) { // note: used '<' , not '='
TokenGroups->Groups[Index] = ...;
}
std::vector<int>
成员变量,这样你就能够关注更有趣的事情了,除非这是一个布局问题。 - fredoverflowblah
需要一个连续的分配,并且foo
的大小是可变的。关于为什么我们首先需要它,这当然是一个很好的设计问题,但我无法在这里讨论。 - MSNblah
需要一个额外的成员,在foo
之前才能有效。 - HelloGoodbye