【问题标题】:type definition in parameter list参数列表中的类型定义
【发布时间】:2011-04-02 08:46:01
【问题描述】:
int func(struct x{int a;}y);
int main()
{

}

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

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

}

疑问:为什么上面的代码在 c++ 中会出错
错误:名为a的多个参数

【问题讨论】:

  • 这不是至少两个不同的问题吗?

标签: c++ c function


【解决方案1】:

一个参数有两次同名是错误的,因为参数名称在其参数列表的范围内。我认为显然两个参数同名是没有用的?

// 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++ 中不允许这样的事情。

【讨论】:

    【解决方案2】:

    我不确定您要做什么。但是,如果函数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 之外的任何其他地方都不可见。

    【讨论】:

    • @Johnsyweb - 这只是我的猜测。但是,如果有人会说我错了,让我们拭目以待,因为在 C++ 中,每件事都可以通过某种我不知道的 hack 来实现。
    【解决方案3】:

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

    • 在第一种情况下,c++ 找到了典型的类型定义语法,而这在 c++ 中是不允许的(观看 Mahesh 的外观)
    • 第二个不包含任何类型定义,所以它不会抱怨它,而是抱怨另一种问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多