为什么在带有变量声明的函数中重用 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 mystructmystruct 同义,假设已经声明了这样的结构。

这个词struct在这个上下文中是

  • 在 C++ 中完全 可选
  • 如果您倾向于认为它是 enum 或其他类型
  • ,则可能有助于提高可读性
  • C 语言的遗留物,在给定类似代码的情况下需要它。