[英]Why is it legal to change function prototype after its definition?
int test();
int test(){
return 5;
}
int test(int in);
int main() {
return test();
}
我知道可以有多个(和类似的)function 声明,并且只有 1 个单一定义。
我的问题与自己定义后的声明有关。 编译器是否选择它遇到的最后一个原型作为真正的原型? 即使它来自父亲的完整定义?
这不会编译并显示错误: error: too few arguments to function 'test'
您的示例代码中有三个test
声明:
int test();
是不是原型1或定义2的声明。int test() { return 5; }
int test() { return 5; }
是一个声明,它是 function 的定义。int test(int in);
是一个声明,它是 function 的原型。简单的声明,编号 1,是不完整的。 3它没有说明是否有任何参数或其类型是什么。 此声明可以由声明 2 或声明 3 完成,但不能同时由两者完成。 如果 2 和 3 都存在,编译器应该给你一个警告或错误信息。 4
具体来说,要回答您的问题“为什么在定义后更改 function 原型是合法的?”:在声明不完整之后,您可以通过添加更多信息来更改关于 function 类型的已知信息,使用旧式定义或现代原型。 除了添加更多信息之外,您无法进行更改。 5 (原型或定义后,function型已完成,不能做任何改动。)
声明 2 匹配旧样式的 function 定义,其中参数在关闭之后定义)
和打开之前{
:
()
{
}
例如:
int test(n, x)
int n;
double x;
{
…
}
这种定义中没有参数时,表示function不带参数。 注意区别:
int test();
没有说参数是什么,甚至没有说有多少。int test() { return 5; }
int test() { return 5; }
说没有参数。如您所见,这些是兼容的:不说明有多少参数与说没有参数是兼容的。 6
声明 3 是一种现代声明,它说有一个参数,类型为int
。 与 2 一样,声明 1 和 3 是兼容的:不说明有多少参数或它们可能具有哪些类型与说有一个int
类型的参数是兼容的。
但是,声明 2 和 3 是不兼容的:
1 function 原型声明了其参数的类型。 由于()
为空,因此没有声明参数类型。 (由于 C 的历史,function 声明中的()
表示没有提及参数,并且(void)
是原型,表示没有参数。)
2 function 定义包括 function 的主体,大括号括起来的复合语句包含 function 执行的代码。
3这里使用的“不完整”是普通英语的意思,而不是 C 标准适用于 object 类型的意思。
4 This is required by the constraint in C 2018 6.7 4: “All declarations in the same scope that refer to the same object or function shall specify compatible types.”
5可能会有一些细微的变化。 例如,可以在参数中添加或删除诸如const
之类的限定符,尽管出于兼容性的目的,这不会更改 function 类型。
6 function类型兼容性的具体规则见C 2018 6.7.6.3 15。
这是不符合 C 标准的无效代码。
根据 C 标准(6.7.6.3 Function 声明符(包括原型))
- 对于要兼容的两个 function 类型...如果一个类型具有参数类型列表,而另一种类型由包含(可能为空)标识符列表的 function 定义指定,则两者应在参数数量和类型方面达成一致每个原型参数的类型应与将默认参数提升应用到相应标识符的类型所产生的类型兼容....
也就是说,在呈现的代码中声明了两个不兼容的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.