检查以下代码段
struct st
{
struct st
{
int a ;
int b ;
} st;
int a1 ;
} ;
struct st obj ;
struct st obj1 ;
int main()
{
return obj.a1 + obj1.b ;
}
Microsoft的编译器Visual Studio 6.0成功编译该程序。我对'struct st'的使用很困惑。 obj和obj1的大小是多少?
答案 0 :(得分:8)
GCC给出
错误:嵌套重新定义'struct st'
错误:'struct st'没有名为'a1'的成员
如果VC6编译了这个,那没关系,但这是无效的。
如果你想知道obj的大小,那就是sizeof obj
。我假设VC6只是将结构扁平化并分配了三个整数。
答案 1 :(得分:1)
obj和obj1的大小相同。 obj.a1 + obj1.b的值未定义,因为两者都未初始化 AND 您的代码 AND 编译器被破坏。如果这实际上是BUILT,那么所有的赌注都会关闭。
<强> NB:强>
该代码从其编译器中获得了大量“ help ”以实际工作。通过“帮助”,我的意思是“我们有一个截止日期将其推出......它的错误分类时间,特别是在解析器方面!”
答案 2 :(得分:1)
快速浏览一下这个让我觉得你已经定义了一个结构,声明了两个struct类型的变量。因此sizeof(obj)和sizeof(obj1)应该是相同的,因为它们都是st类型!不用说,具有相同名称的嵌套结构是非法的!并且惊讶于它编译。但是请记住,自VC 6出局以来,C已经发生了变化(如果我的记忆能正确的话)。
答案 3 :(得分:0)
这不是有效的C代码。 C中没有“类范围”,从C语言的角度来看,struct st
的两个定义都定义了两次相同的类型。这是非法的。
这只是格式良好的C ++代码,但除此之外,程序只是计算并返回0.为什么它跳过所有这些环以返回0超出我。该程序是也像C ++一样错误。将类st
声明为类st
的成员(即具有相同名称)是违法的。