我有以下代码:
#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中的错误?
提前致谢!
答案 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 ++标准的一部分。