参数列表中的类型定义

时间:2011-04-02 08:46:01

标签: c++ c function

int func(struct x{int a;}y);
int main()
{

}

上面的代码在c ++中给出了以下错误 错误:参数类型中可能未定义类型 虽然它在c中运行良好并带有警告,c类型的装置可以在参数列表中定义 因此,以下代码应该在c

中给出重新定义错误
int func(int a,int a);
int main()
{

}

怀疑:为什么上面的代码在c ++中给出了错误 错误:多个参数名为

3 个答案:

答案 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

好的,您正在尝试将结构定义为函数参数的一部分。如果存在这种可能性,那么该定义将是该函数的本地定义。在调用该函数时,您将如何传递参数,因为结构xfunc以外的任何其他位置都不可见。

答案 2 :(得分:0)

我也不确定。但是,如果你问的是为什么会出现这样的错误,那么在它之前就是类型定义

  • 在第一种情况下c ++发现了一种典型的类型定义语法,这在c ++中是不允许的(观看Mahesh应该怎么看)
  • 第二个不包含任何类型定义,所以它不会抱怨它,而是关于其他类型的问题

......我仍然怀疑理解这个问题