2011-04-02 57 views
2
int func(struct x{int a;}y); 
int main() 
{ 

} 

上面的代码给出了在C++
错误以下错误:类型可能无法在参数类型被定义
而在C其运行细跟警告,意味着在C类型可被限定在参数列表
因此下面的代码应该给redefination错误在C类型定义

int func(int a,int a); 
int main() 
{ 

} 

的疑问:为什么上面的代码在C++中
错误给错误:多参数命名为

+0

怀疑这不是至少两个不同的问题吗? – 2011-04-02 22:49:09

回答

4

由于参数名称在其参数列表中的范围内,因此参数具有相同的名称两次是错误的。我认为很明显,有两个参数具有相同的名称是没有用的?

// 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++中。

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之外的其他地方都不可见。

+0

+1用于解释为什么这是不可能的。 – Johnsyweb 2011-04-02 09:02:46

+0

@Johnsyweb - 这只是我的猜测。但是让我们等待是否有人可以说我错了,因为在C++中,每件事都有可能通过某种我不知道的黑客行为来实现。 – Mahesh 2011-04-02 09:06:32

0

我不确定。但如果你问为什么这样的错误,而在此之前它是关于在第一种情况下C++中的语法这是典型的类型定义,这是不是在C不允许类型定义

  • ++(看马赫什怎么做它应该)
  • 第二不包含任何类型定义,所以不要抱怨,但关于其他种类的问题

...还是我理解这个问题