【发布时间】:2015-03-31 12:34:28
【问题描述】:
很抱歉这个模糊的问题,我不确定如何在简洁的同时具体。在查看同事的代码时,我注意到以下行为,我不明白为什么编译器(GCC 4.8.2)不抱怨。这是一个简单的例子:
#include <iostream>
using namespace std;
struct mystruct {
int val;
};
int main()
{
struct mystruct x; //What is the compiler doing here?
/* Do something with x here */
return(0);
}
编译器如何处理struct mystruct x; 行?如果它把它当作一个叫做mystruct的局部结构的声明和一个叫做x的实例的初始化,为什么我可以把x当作在全局范围内定义的mystruct的一个实例?
我的另一个想法是它可能像前向声明一样,但我不知道可以在进行前向声明的同时声明一个类的实例。不过,这仅仅是这里发生的事情吗(除了声明变量,它实际上什么都不做,因为 mystruct 已经定义)?
【问题讨论】:
-
编译器为什么不抱怨的明显答案是它是有效的代码。最简单的答案是它在 C 中是有效的(并且通常是必要的)。
-
如果你见过这样的代码:
typedef struct { ... members ... } struct_name;这就是原因。这种形式允许 C 程序员在没有 struct 关键字的情况下声明结构对象。