提问者:小点点

C++中Struct的类型重定义?


当我学习C++时,对一段C++代码感到困惑,有人能在这方面帮助我吗? 提前谢谢你。

struct LinkNode
{
  int data;
  struct LinkNode* next; // Why there use `struct` type define LinkNode again? 
};

作为我的评论,为什么还要使用struct类型来定义LinkNode呢? 我认为codestruct LinkNode{}已经定义了一个LinkNode。 当然,如果我像下面这样更改代码,它也可以正常工作,没有任何编译错误。

struct LinkNode
{
  int data;
  LinkNode* next; // No any compilation errors either.
};

共2个答案

匿名用户

C++中Struct的类型重定义?

这不是类型重定义。 这称为详细类型说明符。 它可以用来消除类名与隐藏它的另一个名称之间的歧义。 在这种情况下没有必要使用它。 它也不会打破任何东西来使用它。

该代码也可以为C语言中可用的API编写。 在C语言中,这是必要的。

匿名用户

在代码中

struct LinkNode
{
  int data;
  struct LinkNode* next; // Why there use `struct` type define LinkNode again? 
};

struct linknode*next;未定义新类型。 它声明了一个(已经存在的)类型linknode的成员变量next

这里让您感到困惑的可能是关键字struct,正如您已经知道的那样,该关键字在此上下文中完全是可选的。 允许您首先在这里放置struct的原因是源于C.C区分标记名和类型名。 C语言中struct Foo{};形式的声明只引入了标记名Foo,而不引入类型名。 这意味着,要在C语言中实例化Foo对象,需要编写structfoo f;,其中包含struct关键字,以便将标记名转换为相应的类型。

要在C语言中获得正确的类型名称,您必须使用typedef:typedef struct Foo footype;,然后您只需编写footype f;即可。 由于标记名和类型名之间的这种区别在实践中被证明不是很有用,C++简单地摆脱了这种区别,允许使用您熟悉的更简单的声明表示法。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|struct|类型|重|定义)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?