C++ sizeof struct gcc编译成功,但g++编译失败

C++ sizeof struct gcc编译成功,但g++编译失败,c++,struct,g++,C++,Struct,G++,我搜索了很长时间,但没有结果。 谢谢你的帮助。 < P> C和C++是不同语言的不同规则。这是一个C++不严格为C.的超集的例子。 在C语言中,嵌套结构是同一封闭命名空间的成员。因此sizeofstruct next是指之前完全声明的类型next,它有一个成员x,其大小为sizeofint。这是格式良好的代码 在C++中,嵌套类是封闭类的成员——因此Stutt NeXT不引用Test::NeXT,而是在主作用域下的局部类型的前向声明。此类型不完整,因此无法对其应用sizeof 当您使用gcc编译

我搜索了很长时间,但没有结果。
谢谢你的帮助。

< P> C和C++是不同语言的不同规则。这是一个C++不严格为C.</P>的超集的例子。 在C语言中,嵌套结构是同一封闭命名空间的成员。因此sizeofstruct next是指之前完全声明的类型next,它有一个成员x,其大小为sizeofint。这是格式良好的代码

<>在C++中,嵌套类是封闭类的成员——因此Stutt NeXT不引用Test::NeXT,而是在主作用域下的局部类型的前向声明。此类型不完整,因此无法对其应用sizeof


当您使用gcc编译一个以.c结尾的文件时,您将代码编译为一个c程序,因此它会成功。当你用G++编译时,你将代码编译成C++程序,因此错误。P>> C和C++是不同语言的不同规则。这是一个C++不严格为C.</P>的超集的例子。 在C语言中,嵌套结构是同一封闭命名空间的成员。因此sizeofstruct next是指之前完全声明的类型next,它有一个成员x,其大小为sizeofint。这是格式良好的代码

<>在C++中,嵌套类是封闭类的成员——因此Stutt NeXT不引用Test::NeXT,而是在主作用域下的局部类型的前向声明。此类型不完整,因此无法对其应用sizeof


当您使用gcc编译一个以.c结尾的文件时,您将代码编译为一个c程序,因此它会成功。当你用G++编译时,你将代码编译成C++程序,因此错误。p> 如果您像这样更改代码

test.c: In function ‘int main()’:
test.c:12:37: error: invalid application of ‘sizeof’ to incomplete type ‘main()::next’
  printf(" %d \n", sizeof(struct next));

它适用于C++。如果您像这样更改代码,我将使用g++4.9编译它

test.c: In function ‘int main()’:
test.c:12:37: error: invalid application of ‘sizeof’ to incomplete type ‘main()::next’
  printf(" %d \n", sizeof(struct next));

它适用于C++。我用G++ 4.9

编译了你的问题是什么?g++是C++前端。如果你想要C++代码,使用正确的扩展和正确的语法。C和C++是不同的语言,代码看起来像C,但是与C++不兼容。所以你的问题是为什么这个C代码不编译成C++?注意不是所有的有效C程序都是有效的C++程序。您似乎期望逆。好,这里值得注意的细节是默认情况下,GCC通过分析文件扩展名来确定语言,这意味着GCC编译C文件作为C。同时,G++总是编译为C++,不管文件扩展名如何,意思是.c文件被编译成C++。你的问题是什么?G++是C++前端。如果你想要C++代码,使用正确的扩展和正确的语法。C和C++是不同的语言,代码看起来像C,但是与C++不兼容。所以你的问题是为什么这个C代码不编译成C++?注意不是所有的有效C程序都是有效的C++程序。你似乎期望逆。好,这里值得注意的细节是默认情况下,GCC通过分析文件扩展名来确定语言,这意味着GCC编译C文件作为C。同时,G+总是编译为C++,不管文件扩展名,这意味着这个.c文件被编译为C++。也不是有效的C++。@ NaNaLover是的,但是对于这个问题的目的并不重要。问题是在C和C++中嵌套类范围的差异。gcc和clang都允许它作为扩展。@Barry谢谢。现在我知道了C结构和C++结构的区别。对于C++中的这个问题,你有没有使用C++代码的建议?杜智超 是的,我的建议是:不要在allstruct next{intx;}级别[]使用它;也不是有效的C++。@ NaNaLover是的,但是对于这个问题的目的并不重要。问题是在C和C++中嵌套类范围的差异。gcc和clang都允许它作为扩展。@Barry谢谢。现在我知道了C结构和C++结构的区别。对于C++中的这个问题,你有没有使用C++代码的建议?杜智超 是的,我的建议是:不要使用它
#include <stdio.h>

struct test{
    int n;
    struct next{
        int x;
    }level[];
};

int main()
{
    printf(" %d \n", (int)sizeof(test::next));
    return 0;
}