2009-11-12 93 views
5

检查下面的代码片段奇怪的C程序

struct st 
{ 
    struct st 
    { 
     int a ; 
     int b ; 
    } st; 

    int a1 ; 
} ; 

struct st obj ; 
struct st obj1 ; 

int main() 
{ 
    return obj.a1 + obj1.b ; 
} 

微软的编译器的Visual Studio 6.0成功地编译程序。我对'struct st'的使用感到困惑。 obj和obj1的大小是多少?

+1

哪个struct st?这里有4个。 – Naveen 2009-11-12 18:12:56

+0

无论printf(“%d%d \ n”,sizeof(obj),sizeof(obj1));返回... – 2009-11-12 18:13:24

+0

您发布的内容在我能够回忆的任何标准中都是无效的。相应地重新标记。 – 2009-11-12 18:21:32

回答

8

GCC给出

error: nested redefinition of ‘struct st’
error: ‘struct st’ has no member named ‘a1’

如果VC6编译此,这很好,但是这是无效的。

如果你想知道obj的大小,那就是sizeof obj。我假设VC6只是将结构扁平化并分配了三个整数。

+1

顺便说一句,VC9给出的错误:错误C3769:'st' :嵌套类不能和立即封闭的类名称相同 – Naveen 2009-11-12 18:15:07

+0

@jleedev:我想MSVC会将它压平 - 'obj1.st.st.st.st.a = 10'的确会影响'obj1.a'。 – Jacob 2009-11-12 18:16:39

+0

顺便说一句什么是正确的?编译器是否应该发出错误或者应该成功编译程序? – 2009-11-12 18:22:31

1

obj和obj1的大小是一样的。 obj.a1 + obj1.b的值是未定义的,因为未初始化您的代码编译器已损坏。如果那真的是BUILT,所有的投注都关闭。

NB:

该代码得到了 '帮助' 从它的编译器的实际工作有很多。 “帮助”我的意思是“我们有一个截止日期来推动它......它的错误分流时间,特别是在解析器所关心的地方!”

+0

说他们没有被初始化是不正确的。 “全局”对象始终以C初始化为零。当然,这一切都不重要,因为代码不可编译。 – AnT 2009-11-12 18:30:26

+0

@AndreyT:如果真的编译了,我想我们可以抛弃标准中关于事情如何被范围对待的任何残留。 – 2009-11-12 18:32:31

+0

@AndreyT:如果解析器很容易混淆......还有什么呢?我的回答是试图反映,而不是激怒VS球迷。 – 2009-11-12 18:35:53

0

这不是有效的C代码。 C中没有“类作用域”,从C语言的角度来看,struct st的两个定义都定义了两次相同的类型。这是非法的。

这只是C++代码格式良好,但除此之外,程序只是计算并返回0.为什么它跳过所有这些箍来返回0超出了我。该程序也是C++的格式不正确。宣布st类别为st(即具有相同名称)的成员是非法的。

1

只需快速浏览一下,就可以让我认为你已经定义了一个结构,声明了struct类型的两个变量。因此sizeof(obj)和sizeof(obj1)应该是相同的,因为它们都是st类型的!不用说,同名的嵌套结构是非法的!并惊讶于它编译。但请记住,自VC 6出来以后,C已经发生了变化(如果我的记忆能帮助我正确的话)。

+0

VS6在C99被批准之前就出来了,但这不是编译无效代码的原因,因为没有VS版本声称自己也实现了C99。我确信问题在于VS6不是你称之为“迂腐”的C编译器...... – 2009-11-12 20:45:50