【问题标题】:What is the difference between struct Node* and Node* in function call?函数调用中的 struct Node* 和 Node* 有什么区别?
【发布时间】:2018-04-06 11:55:20
【问题描述】:

传递给 function1 和 function2 的内容有什么区别?

struct Node
{
    int data;
    struct Node *next;
};

void function1(struct Node *start)
{
    // ...
}

void function2(Node *start)
{
    // ...
}

【问题讨论】:

  • 无。你是从什么来源学习 C++ 的?
  • @melpomene 不准确。如果名为Node 的对象在范围内,第一个将起作用,第二个将无法编译。如果尚未声明,第一个也将在外部范围内声明struct Node
  • @melpomene 有区别,这个叫Elaborated type specifier
  • "struct Node" 是 C-ism。在 C++ 中,不需要“结构”。
  • @Quentin Point,但在提供的代码中定义了struct Node,并且没有其他对象。

标签: c++ struct scope declaration


【解决方案1】:

本质上的区别在于,在函数声明/定义点之前没有声明类型时会发生什么。

只要function1 不尝试访问对象的任何成员,它就不需要存在类型定义或声明。它具有将struct Node 声明引入封闭范围的效果。

function2 确实需要它(或在某处存在的前向声明),无论它对对象做了什么。它没有隐式引入类类型。

【讨论】:

  • 这是错误的,第二个语法对于不完整的类型足够好(否则我们会到处看到struct Foo)。
  • @Quentin 这并没有错。没有任何Node 声明,function1 有效,function2 无效。您正在考虑问题中不存在的 struct Node;typedef struct Node Node;
  • @Quentin - (通过电线发送不可见的可能能量)。希望剩下的时间对你更好:)
  • @Quentin 请记住,无论您的日子多么糟糕,总有人不得不将 Microsoft Edge 移植到 Android。
【解决方案2】:

除了可能作为前向声明(在您的情况下是一个有争议的问题)之外,根本没有区别。您在函数参数列表中使用struct Node* 是在向C 中的要求致敬。

您不需要在 C++ 中这样做,因为它以不同的方式将其命名空间组织到 C。

有关该构造的更正式解释,请参阅http://en.cppreference.com/w/cpp/language/elaborated_type_specifier

【讨论】:

  • 懒惰的复制粘贴:不准确。如果名为Node 的对象在范围内,第一个将起作用,第二个将无法编译。如果尚未声明,第一个也将在外部范围内声明struct Node
【解决方案3】:

区别可以看下面的代码sn-ps。

第一个是

void function1( struct Node *start );

struct Node
{
    int data;
    struct Node *next;
};

第二个是

void function2( Node *start );

struct Node
{
    int data;
    struct Node *next;
};

第一个代码 sn-p 格式正确。在函数的参数声明中,使用了一个详细的类型说明符,它引入了类型struct Node。结构体本身可以在函数声明之后进一步定义。

对于第二个代码 sn-p 编译器将发出错误,因为名称 Node 未定义。

结构的名称也可以通过变量的声明来隐藏。在这种情况下,您还必须使用结构的详细名称。

例如

struct Node
{
    int data;
    struct Node *next;
};

int Node;

void function1( struct Node *start );

来自 C++ 标准(3.4.4 详细类型说明符)

2 如果详细类型说明符没有嵌套名称说明符,并且 除非详细类型说明符出现在声明中 如下形式:

class-key attribute-specifier-seqopt identifier ;

根据 3.4.1 查找标识符,但忽略任何 已声明的非类型名称....如果详细类型说明符是 由类键引入,此查找未找到以前的 声明的类型名称,或者如果详细类型说明符出现在 声明格式:

class-key attribute-specifier-seqopt identifier ;

详细类型说明符是一个声明,它引入了 3.3.2 中描述的类名

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2018-07-08
    • 2013-12-02
    相关资源
    最近更新 更多