GCC 4.8.x中的错误处理灵活阵列成员?

时间:2017-11-10 12:23:56

标签: c++ g++

我有以下代码:

#include <cstdint>

struct parent
{
   uint64_t   id;    
   char       data[];
};

struct child : public parent
{
   uint32_t tmp;
   char text[];
};

int main() {
    child d;
    d.id = 1;
}

使用GCC 7.2.1编译时,它给了我错误:

flex.cpp:6:20: error: flexible array member ‘parent::data’ not at end of ‘struct child’
    char       data[];
                    ^
flex.cpp:11:13: note: next member ‘uint32_t child::tmp’ declared here
    uint32_t tmp;
             ^~~
flex.cpp:9:8: note: in the definition of ‘struct child’
 struct child : public parent
        ^~~~~

使用GCC 4.8.5编译时,没有警告也没有错误。

GCC 4.8.5中的错误?

提前致谢!

1 个答案:

答案 0 :(得分:1)

是的,这看起来像是GCC 4.8中的一个错误。子类使用的内存超出了超类的内存。灵活的数组成员在语法上位于超类的末尾,但不适用于整个对象的内存布局。这类似于涉及组成的C案例:

struct parent
{
   uint64_t   id;    
   char       data[];
};

struct child
{
   struct parent parent;
   uint32_t tmp;
   char text[];
};

这也不是有效的C,虽然GCC 7及更早版本仅用-pedantic发出警告(我认为这有点鲁莽)。

请注意,灵活的数组成员是GNU扩展,不是C ++标准的一部分。