我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践.但是,该声明没有任何论据支持.这是公认的事实吗?
(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组.例如:)
struct header {
size_t len;
unsigned char data[];
};
Run Code Online (Sandbox Code Playgroud) 结构hack你有一个长度为0的数组作为C90和C99的结构的最后一个成员是众所周知的,并且随着C99中灵活的数组成员的引入,我们甚至得到了使用它的标准化方法[].不幸的是,C++没有提供这样的构造,并且(至少使用Clang 3.4),使用[0]或编译结构或[]将产生编译警告--std=c++11 -pedantic:
$ cat test.cpp
struct hack {
char filler;
int things[0];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:14: warning: zero size arrays are an extension [-Wzero-length-array]
int things[0];
Run Code Online (Sandbox Code Playgroud)
和类似的
$ cat test.cpp
struct fam {
char filler;
int things[];
};
$ clang++ --std=c++11 -pedantic test.cpp
\test.cpp:3:7: warning: flexible array members are a C99 feature [-Wc99-extensions]
int things[];
Run Code Online (Sandbox Code Playgroud)
我的问题是这个; 说我希望有一个包含可变大小数组的结构作为C++中的最后一项.给定支持两者的编译器,做什么是正确的?我应该使用struct hack [0](编译器扩展)还是FAM [](这是C99功能)?据我所知,要么会奏效,但我想弄明白哪个是较小的邪恶?
此外,在人们开始建议int*在结构中保留一个单独分配的内存之前,这不是一个令人满意的答案.我想分配一块内存来保存我的struct和数组元素.使用std :: vector也属于同一类别.如果你想知道为什么我不想使用指针,那么 …
为什么C允许这样:
typedef struct s
{
int arr[];
} s;
数组arr没有指定大小?
在C++ 11中,它允许您创建一个0长度为C的数组,std:array如下所示:
int arr1[0];
std::array arr2<int,0>;
Run Code Online (Sandbox Code Playgroud)