#include <stdio.h>
typedef struct test{
int n;
struct next{
int x;
}level[];
}test;
int main()
{
printf(" %d \n", sizeof(struct next));
return 0;
}
我有一个名为test.c的代码。 它是从c源代码复制而来的。当我用Gcc编译它时,它取得了成功。 但是当我用g ++编译它时,编译器会抱怨:
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));
我搜索了很长时间,但没有结果。 谢谢你的帮助。
答案 0 :(得分:2)
C和C ++是具有不同规则的不同语言。这是一个这样的例子,其中C ++并不是C的超集。
在C中,嵌套结构是同一个封闭命名空间的成员。因此sizeof(struct next)
引用之前完全声明的类型next
,其成员x
,其大小为sizeof(int)
。这是格式良好的代码。
在C ++中,嵌套类是封闭类的成员 - 因此struct next
不引用test::next
而是本地类型{{1}的前向声明在next
的范围内。此类型不完整,因此您无法将main()
应用于此类型。
当您使用gcc编译以sizeof()
结尾的文件时,您将代码编译为C程序,因此它会成功。使用g ++编译时,您将代码编译为C ++程序,因此出错。
答案 1 :(得分:1)
如果您更改
之类的代码#include <stdio.h>
struct test{
int n;
struct next{
int x;
}level[];
};
int main()
{
printf(" %d \n", (int)sizeof(test::next));
return 0;
}
它适用于C ++。我用g ++ 4.9
编译它