传递给function1和function2的内容有什么区别?
struct Node
{
int data;
struct Node *next;
};
void function1(struct Node *start)
{
// ...
}
void function2(Node *start)
{
// ...
}
答案 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