为什么在带有变量声明的函数中重用 struct 关键字时编译器不报错?
Why does the compiler not complain when the struct keyword is reused in a function, with a variable declaration?
抱歉这个模糊的问题,我不确定如何在简洁的同时具体。我在查看同事的代码时注意到以下行为,我不明白为什么编译器 (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
的一个实例在全局范围内定义?
我的另一个想法是它可能像前向声明一样,但我不知道可以在进行前向声明的同时声明 class 的实例。不过,这仅仅是这里发生的事情吗(由于 mystruct
已经定义,它实际上除了声明变量之外什么都不做)?
编译器不会报错,因为你的代码没有任何问题。您所做的正是您所描述的。您已将 x
定义为 mystruct
.
类型的变量
您可能不熟悉这种形式,但在 C 中,这是将变量声明为 struct
类型的唯一方法。它在 C++ 中不太常见,因为 struct
关键字在这种情况下是可选的;但是,C++ 保持与传统 C 语法的兼容性。
这是 c
语法,因此对 c++
有效。
在 c
中,如果您希望在声明中删除 struct
关键字,则需要使用 typedef
。
事实上,如果您声明了 typedef
和非类型定义的名称,您可以使用任一语法进行初始化。
例如
typedef struct mystruct {
int val;
} mystruct;
int main()
{
mystruct x;
struct mystruct x2;
/* Do something with x here */
return(0);
}
对于 c++
不需要在 struct
的声明中使用 typedef
,因此在实例声明中使用 struct
是可选的, 主要由于遗留原因而支持。
如果您发现自己在交叉 C/C++ 代码库上工作,了解两者如何像这样愉快地一起玩会很有用。
struct mystruct
与 mystruct
同义,假设已经声明了这样的结构。
这个词struct
在这个上下文中是
- 在 C++ 中完全 可选
- 如果您倾向于认为它是
enum
或其他类型 ,则可能有助于提高可读性
- C 语言的遗留物,在给定类似代码的情况下需要它。
抱歉这个模糊的问题,我不确定如何在简洁的同时具体。我在查看同事的代码时注意到以下行为,我不明白为什么编译器 (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
的一个实例在全局范围内定义?
我的另一个想法是它可能像前向声明一样,但我不知道可以在进行前向声明的同时声明 class 的实例。不过,这仅仅是这里发生的事情吗(由于 mystruct
已经定义,它实际上除了声明变量之外什么都不做)?
编译器不会报错,因为你的代码没有任何问题。您所做的正是您所描述的。您已将 x
定义为 mystruct
.
您可能不熟悉这种形式,但在 C 中,这是将变量声明为 struct
类型的唯一方法。它在 C++ 中不太常见,因为 struct
关键字在这种情况下是可选的;但是,C++ 保持与传统 C 语法的兼容性。
这是 c
语法,因此对 c++
有效。
在 c
中,如果您希望在声明中删除 struct
关键字,则需要使用 typedef
。
事实上,如果您声明了 typedef
和非类型定义的名称,您可以使用任一语法进行初始化。
例如
typedef struct mystruct {
int val;
} mystruct;
int main()
{
mystruct x;
struct mystruct x2;
/* Do something with x here */
return(0);
}
对于 c++
不需要在 struct
的声明中使用 typedef
,因此在实例声明中使用 struct
是可选的, 主要由于遗留原因而支持。
如果您发现自己在交叉 C/C++ 代码库上工作,了解两者如何像这样愉快地一起玩会很有用。
struct mystruct
与 mystruct
同义,假设已经声明了这样的结构。
这个词struct
在这个上下文中是
- 在 C++ 中完全 可选
- 如果您倾向于认为它是
enum
或其他类型 ,则可能有助于提高可读性
- C 语言的遗留物,在给定类似代码的情况下需要它。