奇怪的C程序

时间:2009-11-12 18:09:29

标签: c visual-studio

检查以下代码段

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的大小是多少?

4 个答案:

答案 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的成员(即具有相同名称)是违法的。