函数调用中struct Node *和Node *之间有什么区别?

时间:2018-04-06 11:55:21

标签: c++ struct scope declaration

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

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

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

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

3 个答案:

答案 0 :(得分:5)

除了潜在地作为前瞻性声明(在你的情况下是一个有争议的点)之外,没有任何区别。您在函数参数列表中使用struct Node*正在向C语言中的需求致敬。

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

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

答案 1 :(得分:5)

差别在于,当事先未在函数声明/定义点声明类型时会发生什么。

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

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

答案 2 :(得分:2)

可以在以下代码段中看到差异。

第一个是

void function1( struct Node *start );

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

第二个是

void function2( Node *start );

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

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

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

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

例如

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

int Node;

void function1( struct Node *start );

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

  

2如果elaborated-type-specifier没有嵌套名称说明符,和   除非详细说明类型说明符出现在声明中   以下表格:

class-key attribute-specifier-seqopt identifier ;
  

根据3.4.1查找标识符但忽略任何标识符   已声明的非类型名称....如果elaborated-type-specifier是   由class-key引入,这个查找以前找不到   声明的类型名称,或者如果elaborated-type-specifier出现在   表格声明:

class-key attribute-specifier-seqopt identifier ;
  

elaborated-type-specifier是一个引入的声明   class-name,见3.3.2