int func(struct x{int a;}y);
int main()
{
}
上面的代码在c ++中给出了以下错误 错误:参数类型中可能未定义类型 虽然它在c中运行良好并带有警告,c类型的装置可以在参数列表中定义 因此,以下代码应该在c
中给出重新定义错误int func(int a,int a);
int main()
{
}
怀疑:为什么上面的代码在c ++中给出了错误 错误:多个参数名为
答案 0 :(得分:5)
让参数具有两次相同的名称是错误的,因为参数名称在其参数列表的范围内。我认为有两个参数具有相同名称是显而易见的吗?
// Explain why you want to have them say "int a, int a"
int func(int a, int b);
在C中,允许在参数类型列表中定义结构类型的内容。标记标识符具有原型范围或块范围(当函数是定义时)并且没有链接,这意味着它不同于在原型或块之外声明的结构,其标记标识符具有文件范围。除了从它的体内递归之外,你不能调用这样的函数。
int func(struct x{int a;} y) {
func(y); // fine (the call, not the endless recursion)
}
请注意,这仅适用于在func
定义的同一翻译单元中发生的调用。如果在另一个翻译单元中,您声明函数和结构如下,那就完全正常了,函数将是可调用的(你需要确保上面的声明不可见,否则你会发生冲突,因为两点的x
表示不同的类型)。
struct x {int a;};
int func(struct x y);
在两个翻译单元中,即使x
是不同的类型(因为它们是不同的翻译单元),类型也是兼容,这是对参数类型唯一重要的。
您不仅可以在参数列表中定义结构,还可以在函数的返回类型部分中定义
struct x {int a;} func(void) {
return (struct x){ 0 };
}
这也仅适用于C.在C ++中不允许这样的事情。
答案 1 :(得分:3)
我不确定你要做什么。但是,如果函数func
需要采用struct x
类型的参数,那么 -
struct x
{
// ....
};
int func( struct x obj ) ;
int func( int a, int b ) ; // Notice that the second parameter is changed
// from a to b. Both the parameters cannot have
// the same name
好的,您正在尝试将结构定义为函数参数的一部分。如果存在这种可能性,那么该定义将是该函数的本地定义。在调用该函数时,您将如何传递参数,因为结构x
在func
以外的任何其他位置都不可见。
答案 2 :(得分:0)
我也不确定。但是,如果你问的是为什么会出现这样的错误,那么在它之前就是类型定义
......我仍然怀疑理解这个问题