gpt4 book ai didi

c - 为什么在定义后更改函数原型(prototype)是合法的?

转载 作者:行者123 更新时间:2023-12-04 14:07:04 26 4
gpt4 key购买 nike

int test();
int test(){
return 5;
}
int test(int in);

int main() {
return test();
}

我知道一个函数可以有多个(和类似的)声明,而只有一个定义。

我的问题与自己定义后的声明有关。编译器会选择它遇到的最后一个原型(prototype)作为真正的原型(prototype)吗?即使它是父亲的完整定义?

这不会编译错误说:错误:函数“test”的参数太少

最佳答案

在你的示例代码中有3个test的声明:

  1. int test(); 是不是原型(prototype)1 或定义2 的声明。
  2. int test() { 返回 5; 是一个声明,它是函数的定义。
  3. int test(int in); 是作为函数原型(prototype)的声明。

简单的声明,编号 1,是不完整的。3 它没有说明是否有任何参数或它们的类型是什么。该声明可以由声明 2 或声明 3 完成,但不能同时由两者完成。如果 2 和 3 都存在,编译器应该给你一条警告或错误消息。4

具体来说,要回答您的问题“为什么在定义后更改函数原型(prototype)是合法的?”:在不完整的声明之后,您可以通过添加更多信息来更改已知的函数类型,使用旧式定义或现代原型(prototype)。除了添加更多信息外,您无法进行任何更改。5(原型(prototype)或定义后,函数类型已完成,您无法进行任何更改。)

声明 2 匹配旧式函数定义,其中参数在结束 ) 和开始 { 之前定义:

<i>return-type</i> <i>name-of-function</i>(<i>names-of-parameters</i>)
<i>declarations of parameters</i>
{
<i>body-of-function</i>
}

For example:

int test(n, x)
int n;
double x;
{

}

当这种风格的定义中没有参数时,表示该函数不带参数。注意区别:

  • int test(); 没有说参数是什么,甚至没有说有多少。
  • int test() { 返回 5; 表示没有参数。

如您所见,这些是兼容的:不说明有多少参数与说没有参数是兼容的。6

声明 3 是一种现代声明,表示有一个参数,类型为 int。与 2 一样,声明 1 和 3 是兼容的:不说明有多少参数或它们可能具有的类型与说有一个 int 类型的参数兼容。

但是,声明 2 和 3 是不兼容的:

  • 声明 2 表示没有参数。
  • 声明 3 说只有一个参数。

脚注

1 函数原型(prototype)声明其参数的类型。由于 () 为空,因此没有声明参数类型。 (由于 C 语言的历史,函数声明中的 () 意味着没有关于参数的说明,而 (void) 是表示没有参数的原型(prototype)。)

2 函数定义包括函数体,大括号复合语句包含函数执行的代码。

3 这里使用的“不完整”是普通英语意义上的,而不是 C 标准适用于对象类型的意义上。

4 这是 C 2018 6.7 4 中的约束所要求的:“同一范围内引用同一对象或函数的所有声明应指定兼容的类型。”

5 可能会有一些细微的变化。例如,可以在参数中添加或删除诸如 const 的限定符,尽管出于兼容性目的这不会更改函数类型。

6 函数类型兼容性的具体规则在 C 2018 6.7.6.3 15 中。

关于c - 为什么在定义后更改函数原型(prototype)是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67728450/

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