- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
int test();
int test(){
return 5;
}
int test(int in);
int main() {
return test();
}
我知道一个函数可以有多个(和类似的)声明,而只有一个定义。
我的问题与自己定义后的声明有关。编译器会选择它遇到的最后一个原型(prototype)作为真正的原型(prototype)吗?即使它是父亲的完整定义?
这不会编译错误说:错误:函数“test”的参数太少
最佳答案
在你的示例代码中有3个test
的声明:
int test();
是不是原型(prototype)1 或定义2 的声明。int test() { 返回 5;
是一个声明,它是函数的定义。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 是不兼容的:
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/
(注意:这个问题的动机是试图提出预处理器黑客来生成无操作分配来回答另一个问题: Macro that accept new object ...请记住这一点!) 这是一个人为的类: class foo
所以我尝试用java编写一个井字棋游戏。大部分已经完成,但是,如果有人选择了已被占用的空间,我无法返回无效的移动。 这是我试图弄清楚的代码。我认为由于空间是由数字 0 表示的(我的教授告诉我们这一点)
我想使用 Java 代码获取某些 Google 搜索引擎查询(在整个网络上)的估计结果数。 我每天只需要做很少的查询,所以一开始 Google Web Search API ,虽然已被弃用,但似乎已经
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
C++ Primer, 5e 的练习 4.20 询问表达式 iter++->empty(); 是否成立是合法的。假设iter是 vector::iterator . 这个表达式是合法的。我用gcc编译
在 C++ 中,动态内存(取消)分配(malloc-free/new-delete)显然可以重复获得相同的内存范围,该内存范围被释放并按顺序再次分配。在多线程 C++ 中,这可能发生在多个线程中。 显
AesCryptoServiceProvider.LegalKeySizes 字段显示允许的位大小。 但是我不明白的是,如果这些都是真的,我如何才能成功利用 2048 位 key 长度(256 字节)
我有一个结构: typedef struct _n { int type; union { char *s; int i; }; } n; 当我
这个问题在这里已经有了答案: 关闭10年前. Possible Duplicate: int var = 1; void main() { int i = i; } 以下代码在g++和Visual C
根据 C++03 标准 (5.3.4/7): When the value of the expression in a direct-new-declarator is zero, the allo
我正在尝试创建一个生成器,使用 scalacheck 1.6.6 和规范 1.7 (scala 2.8.1) 生成(非零长度)合法的 unicode 字符串。 我希望我可以创建像这样的生成器: obj
这确实是一个关于 C++ 的问题,而不是 OpenGL。我正在关注 this OpenGL 教程(我刚开始),作者使用 C++(不是 C)。我的问题是 glVertexAttribPointer ta
由于 C++ 别名规则,您不能随意将 (一个 int*) 指向 char 数组,这似乎达成了一些共识。 从另一个问题——Generic char[] based storage and avoidin
我正在寻找一个通过 HTTP 接口(interface)发送文本消息的 SMS 网关。 但是,有些短信网关不允许设置发件人ID,允许的要么要求用户证明发件人ID是自己的手机号码,要么手动检查每个发件人
我们注意到您的应用要求用户注册个人信息才能访问非基于帐户的功能。在允许访问与用户无关的应用内容和功能之前,应用不能要求用户注册。 我们在注册时采用电子邮件 ID,因为所有数据都代表电子邮件 ID 在后
我一直在阅读 Bloch 和 Gafter 的 Java Puzzlers,并读到了第 10 个谜题 (Tweedledee)。这个谜题的本质是 provide declarations for th
这个问题确实符合标题:我很想知道造成这种差异的技术原因是什么,以及基本原理? std::shared_ptr sharedToVoid; // legal; std::unique_ptr uniqu
我试图做的是将数据框数据附加到现有的合法 excel 文件中。我使用了 openpyxl 中的 load_workbook() 函数,但它系统地返回了一个错误。这是一些在我的机器上崩溃的代码: fro
App 多次被 Apple 拒绝 “经过进一步审查,我们仍然发现您的应用使用了后台定位服务,但并未按照 iOS 人机界面指南的要求在位置模式警报中阐明其使用目的。” 在“NSLocationAlway
据我所知,像这样在 C++ 中实例化一个整数是合法的: int x = int(5); 作为一名 Java 程序员,我会假设这行代码调用传递“5”作为参数的整数的构造函数。我读到 int 不是一个类,
我是一名优秀的程序员,十分优秀!