相关疑难解决方法(0)

为什么变长数组不是C++标准的一部分?

在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.

显然在C99中,以下语法有效:

void foo(int n) {
    int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?

一些潜在的原因:

  • 毛茸茸的编译器供应商实现
  • 与标准的其他部分不兼容
  • 可以使用其他C++构造模拟功能

C++标准规定数组大小必须是常量表达式(8.3.4.1).

是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:

void foo(int x, int y, int z) {
    int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

vector版本变得很笨拙:

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)

切片,行和列也可能遍布整个内存.

看一下comp.std.c++这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector总是更好的解决方案.

c++ arrays standards variable-length variable-length-array

311
推荐指数
7
解决办法
14万
查看次数

结构中零长度数组的目的是什么?

当我查看Linux内核代码时,找到以下代码:

   struct thread_info {
    struct task_struct  *task;
    struct exec_domain  *exec_domain;
    unsigned long       flags;
    __u32           status;
    __u32           cpu;
    int         preempt_count;
    mm_segment_t        addr_limit;
    struct restart_block    restart_block;
    void __user     *sysenter_return;
    unsigned long           previous_esp;
    __u8            supervisor_stack[0];
};
Run Code Online (Sandbox Code Playgroud)

注意最后一个变量"supervisor_stack",它是一个零长度数组,它的用法是什么?提前致谢!

c linux

43
推荐指数
2
解决办法
3万
查看次数

C ++“替换”为具有灵活数组成员的结构

考虑下面的C99结构,以灵活的数组成员结尾:

struct hdr
{
  size_t len;   
  size_t free;  
  char buf[];
};
Run Code Online (Sandbox Code Playgroud)

len例如,使用这样的内联函数(放入头文件中)进行访问,并将其buf作为参数:

static inline size_t slen(const char *s)
{
  struct hdr *h = (struct hdr*)(s - (int)offsetof(struct hdr, buf));
  return h->len;
}
Run Code Online (Sandbox Code Playgroud)

这是库的一部分,将使用C编译器进行编译。但是,我想从C ++访问该库。这实质上意味着相应的头文件(带有适当的extern "C" {...}防护)必须是有效的C ++代码。一种可能的解决方案是slen在源代码主体中定义功能,而完全避免使用内联代码,但这不是最佳选择。

我的想法是定义一个有效的虚拟C ++结构,并且可以通过某种方式将其映射到hdr,例如

struct cpp_hdr
{
  size_t len;
  size_t free;
  char buf[1];
}
Run Code Online (Sandbox Code Playgroud)

请注意,我只希望得到正确的(负)的偏移值lenfree; 没有访问buf的意图。

现在我的问题是:是否有任何保证

static inline size_t slen(const char *s)
{
  struct cpp_hdr *h = (struct cpp_hdr*)(s …
Run Code Online (Sandbox Code Playgroud)

c c++ arrays flexible-array-member

5
推荐指数
1
解决办法
879
查看次数