int func(struct x{int a;}y);
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
上面的代码在c ++
错误中给出以下错误:类型可能没有在参数类型中定义,
而它在c中运行正常并带有警告,c类型中的含义可能在参数列表中定义,
因此下面的代码应该在c中给出重新定义错误
int func(int a,int a);
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
怀疑:为什么上面的代码在c ++
错误中给出错误:多个参数命名为a
让参数具有两次相同名称是错误的,因为参数名称在其参数列表中的范围内.我认为有两个参数具有相同名称是显而易见的吗?
// Explain why you want to have them say "int a, int a"
int func(int a, int b);
Run Code Online (Sandbox Code Playgroud)
在C中,允许在参数类型列表中定义结构类型的内容.标记标识符具有原型范围或块范围(当函数是定义时)并且没有链接,这意味着它与在原型或块之外声明的结构不同,其标记标识符具有文件范围.除了从它的体内递归之外,你不能调用这样的函数.
int func(struct x{int a;} y) {
func(y); // fine (the call, not the endless recursion)
}
Run Code Online (Sandbox Code Playgroud)
请注意,这仅适用于在func定义的同一翻译单元中发生的调用.如果在另一个翻译单元中您按如下方式声明函数和结构,那就完全没问题,并且该函数可以调用(您需要确保上面的声明是不可见的,否则你会发生冲突,因为x在两个点都表示不同的类型).
struct x {int a;};
int func(struct x y);
Run Code Online (Sandbox Code Playgroud)
在两个翻译单元中,即使x是不同的类型(因为它们是不同的翻译单元),类型也是兼容的,这是参数类型唯一重要的.
您不仅可以在参数列表中定义结构,还可以在函数的返回类型部分中定义结构
struct x {int a;} func(void) {
return (struct x){ 0 };
}
Run Code Online (Sandbox Code Playgroud)
这也仅适用于C.在C++中不允许这样的事情.
| 归档时间: |
|
| 查看次数: |
1571 次 |
| 最近记录: |