C++ 在函数调用中,结构节点*和节点*之间有什么区别?
传递给函数1和函数2的内容有什么区别C++ 在函数调用中,结构节点*和节点*之间有什么区别?,c++,struct,scope,declaration,C++,Struct,Scope,Declaration,传递给函数1和函数2的内容有什么区别 struct Node { int data; struct Node *next; }; void function1(struct Node *start) { // ... } void function2(Node *start) { // ... } 除了作为一种潜在的前瞻性声明(在您的案例中,这是一个没有实际意义的点)存在之外,根本没有区别。在函数参数列表中使用struct节点*,是对C语言的要求的尊重 你不
struct Node
{
int data;
struct Node *next;
};
void function1(struct Node *start)
{
// ...
}
void function2(Node *start)
{
// ...
}
除了作为一种潜在的前瞻性声明(在您的案例中,这是一个没有实际意义的点)存在之外,根本没有区别。在函数参数列表中使用
struct节点*
,是对C语言的要求的尊重
<>你不需要在C++中这样做,因为它有一种不同的方式来将它的命名空间组织到C.<
有关构造的更正式的解释,请参见本质上的区别在于,在函数声明/定义点之前没有声明类型时会发生什么 只要
function1
不尝试访问对象的任何成员,就不需要存在类型定义或声明。它的作用是将struct Node
声明引入封闭范围
function2
确实需要它(或存在的某个地方的转发声明),不管它对对象做了什么。它不会隐式地引入类类型。在以下代码段中可以看出差异
第一个是
void function1( struct Node *start );
struct Node
{
int data;
struct Node *next;
};
第二个是
void function2( Node *start );
struct Node
{
int data;
struct Node *next;
};
第一个代码段格式良好。在函数的参数声明中,使用了详细的类型说明符,该说明符引入了类型struct节点
。在函数声明之后,可以进一步定义结构本身
对于第二个代码段,编译器将发出错误,因为未定义名称节点
也可以通过变量声明隐藏结构的名称。在这种情况下,还必须使用结构的详细名称
比如说
struct Node
{
int data;
struct Node *next;
};
int Node;
void function1( struct Node *start );
从C++标准(3.4.4详细说明类型说明符)
2如果详细说明的类型说明符没有嵌套的名称说明符,以及 除非详细的类型说明符出现在带有 以下表格: 根据3.4.1查找标识符,但忽略任何 已声明的非类型名称…如果详细说明的类型说明符为 由类键引入,此查找未找到以前的 声明的类型名称,或者如果详细的类型说明符出现在 声明及表格: 详细的类型说明符是介绍 类名如3.3.2所述没有一个你从C++学习什么来源?如果名为
Node
的对象在作用域中,第一个将起作用,第二个将不会编译。如果尚未声明,第一个也将在外部范围中声明struct Node
。@melpomene存在差异,这称为“struct Node”,是一个C-ism。在C++中,“Stutt”是不需要的。@昆廷点,但是在提供的代码<代码>中定义了Stutt节点,并且没有其他对象。如果名为Node
的对象在作用域中,第一个将起作用,第二个将不会编译。如果尚未声明,第一个语法还将在外部作用域中声明struct Node
。这是错误的,第二个语法对于不完整的类型来说已经足够好了(否则我们会到处看到struct Foo
。@Quentin这并不是真的错误。如果不声明节点
,函数1
起作用,函数2
不起作用。您正在考虑一个struct节点代码>或类型定义结构节点代码>这在问题中不存在。@Quentin-@Quentin-(通过导线发送不可见的可能能量)。希望这一天剩下的时间对你更好:)@Quentin记住,不管你今天过得多么糟糕,总有人不得不将Microsoft Edge移植到Android上。
class-key attribute-specifier-seqopt identifier ;
class-key attribute-specifier-seqopt identifier ;