gpt4 book ai didi

c++ - 参数列表中的类型定义

转载 作者:太空狗 更新时间:2023-10-29 20:06:55 25 4
gpt4 key购买 nike

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

}

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

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

}

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

最佳答案

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

// Explain why you want to have them say "int a, int a"
int func(int a, int b);

在 C 中,允许在参数类型列表中定义结构类型的内容。标签标识符具有原型(prototype)范围或 block 范围(当函数是定义时)并且没有链接,这意味着它不同于在原型(prototype)或 block 之外声明的结构,其标签标识符具有文件范围。你不能调用这样的函数,除非从它的主体内部递归地调用。

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

关于c++ - 参数列表中的类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com