MSN*_*MSN 36 c++ flexible-array-member
在C99中,您可以声明结构的灵活数组成员:
struct blah
{
int foo[];
};
Run Code Online (Sandbox Code Playgroud)
但是,当有人在这里工作时尝试使用C++中的clang编译一些代码时,该语法不起作用.(它一直在与MSVC合作.)我们不得不将其转换为:
struct blah
{
int foo[0];
};
Run Code Online (Sandbox Code Playgroud)
通过C++标准,我发现根本没有提到灵活的成员数组; 我一直认为这[0]是一个无效的声明,但显然对于一个灵活的成员数组它是有效的.灵活的成员数组在C++中实际上是否有效?如果是这样,是正确的声明[]还是[0]?
Mar*_*wis 26
C++最初是在1998年标准化的,所以它早于将灵活的数组成员添加到C(这在C99中是新的).2003年对C++有一个更正,但没有添加任何相关的新功能.C++的下一个版本(C++ 0x)仍在开发中,似乎没有添加灵活的数组成员.
Mic*_*urr 19
C++不支持结构末尾的C99灵活数组成员,使用空索引表示法或0索引表示法(禁止特定于供应商的扩展):
struct blah
{
int count;
int foo[]; // not valid C++
};
struct blah
{
int count;
int foo[0]; // also not valid C++
};
Run Code Online (Sandbox Code Playgroud)
据我所知,C++ 0x也不会添加这个.
但是,如果将数组的大小设置为1个元素:
struct blah
{
int count;
int foo[1];
};
Run Code Online (Sandbox Code Playgroud)
事情是有效的,并且工作得很好.您可以使用不太可能具有逐个错误的表达式来分配适当的内存:
struct blah* p = (struct blah*) malloc( offsetof(struct blah, foo[desired_number_of_elements]);
if (p) {
p->count = desired_number_of_elements;
// initialize your p->foo[] array however appropriate - it has `count`
// elements (indexable from 0 to count-1)
}
Run Code Online (Sandbox Code Playgroud)
因此它可以在C90,C99和C++之间移植,并且与C99的灵活阵列成员一样.
Raymond Chen对此做了一个很好的写作:为什么有些结构以1的数组结束?
注意:在Raymond Chen的文章中,初始化"灵活"数组的示例中存在一个错字/错误.它应该是:
for (DWORD Index = 0; Index < NumberOfGroups; Index++) { // note: used '<' , not '='
TokenGroups->Groups[Index] = ...;
}
Run Code Online (Sandbox Code Playgroud)
如果您可以将应用程序限制为仅需要几个已知大小,那么您可以使用模板有效地实现灵活的数组。
template <typename BASE, typename T, unsigned SZ>
struct Flex : public BASE {
T flex_[SZ];
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18932 次 |
| 最近记录: |