相关疑难解决方法(0)

在C练习中使用灵活的阵列成员?

我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践.但是,该声明没有任何论据支持.这是公认的事实吗?

(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组.例如:)

struct header {
    size_t len;
    unsigned char data[];
};
Run Code Online (Sandbox Code Playgroud)

c arrays data-structures flexible-array-member

71
推荐指数
7
解决办法
6万
查看次数

在C++中构造hack等价物

结构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++ arrays struct flexible-array-member c++11

22
推荐指数
3
解决办法
2783
查看次数

结构中的Unsized数组声明

为什么C允许这样:

typedef struct s
{
  int arr[];
} s;

数组arr没有指定大小?

c arrays flexible-array-member

12
推荐指数
1
解决办法
4358
查看次数

0长度数组(或std :: array)的用途是什么?

在C++ 11中,它允许您创建一个0长度为C的数组,std:array如下所示:

int arr1[0];
std::array arr2<int,0>;
Run Code Online (Sandbox Code Playgroud)
  1. 所以我在想什么是没有空间存储的数组的用途?
  2. 其次什么是零长度阵列?如果它是一个指针,它指向哪里?

c++ arrays stdarray

11
推荐指数
1
解决办法
1301
查看次数