【问题标题】:Why does the compiler not complain when the struct keyword is reused in a function, with a variable declaration?为什么在函数中重用 struct 关键字并声明变量时编译器不会报错?
【发布时间】: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 关键字的情况下声明结构对象。

标签: c++ struct


【解决方案1】:

编译器不会抱怨,因为您的代码没有任何问题。你所做的正是你所描述的。您已将x 定义为mystruct 类型的变量。

您可能不熟悉这种形式,但在 C 中,这是将变量声明为 struct 类型的唯一方法。它在 C++ 中不太常见,因为在这种情况下 struct 关键字是可选的;但是,C++ 保持与传统 C 语法的兼容性。

【讨论】:

  • 感谢您的解释。正如您所建议的,我对这种形式不熟悉,以前很少使用 C。
【解决方案2】:

这是c 语法,因此对c++ 有效。

c 中,如果您希望在声明中删除struct 关键字,则需要使用typedef

确实,如果您声明 typedef'd 和 untypedef'd 名称,您可以使用任一语法进行初始化。

例如

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++ 代码库,那么了解两者如何像这样愉快地一起玩会很有帮助。

【讨论】:

    【解决方案3】:

    struct mystructmystruct 同义,假设已经声明了这样的结构。

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

    • 在 C++ 中完全可选
    • 潜在的可读性帮助,如果您倾向于认为它是 enum 或其他类型
    • 从 C 语言中继承而来,在类似代码的情况下需要它。

    【讨论】:

      猜你喜欢
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 2013-03-24
      • 2019-12-26
      • 1970-01-01
      相关资源
      最近更新 更多