为什么没有显示 - 在声明之前调用函数的错误
Why the error of - calling the function before being declared, is not shown?
main()
{
f();
}
int f( int i, float fl)
{
printf("function");
}
为什么上面的代码在"C"中成功运行并打印
function
何时应该报告错误,因为在声明之前调用 f ()。当它在"C"中成功运行时,为什么不在"C++"中运行。在 c++ 中运行时,它显示:
error: 'f' was not declared in this scope
如果是因为编译器假设一个未声明的函数返回一个 int 并接受未指定数量的参数,那么为什么它也为下面的函数成功运行(即当返回返回类型为 void 而不是 int 时?
void f ( int i, float fl)
{
printf("function");
}
-
旧版本的 C 编程语言允许没有早期声明的函数引用。作为遗产,许多当前的编译器仍然支持旧语言或其方面。这就是为什么一些编译器接受您显示的源代码的原因。编译器可能有开关,告诉它使用最新版本的 C 编程语言,或者更严格地遵守标准。
-
C++是最近开发的,没有没有声明的功能遗留下来。
-
不同的返回类型之所以有效,是因为汇编语言恰好以相同的方式实现。对于返回 void 的函数,被调用的例程只是执行其操作并返回。对于返回 int 的函数,被调用的例程执行其操作,将其最终结果放入特定的处理器寄存器中,然后返回。在调用例程中,当不使用返回 int 的函数的返回值时,调用例程只会忽略处理器寄存器中的内容。由于寄存器被忽略,因此对于调用例程,返回 void 的函数和返回 int 的函数之间没有区别。并非所有目标平台都是如此;具有不同返回类型的函数之间可能存在差异,尤其是当返回类型是更复杂的对象(如结构)时。而且,如果调用函数确实使用了返回值,则返回类型将有所不同。返回 void 的函数会在处理器寄存器中留下一些不受控制的值,其中应该有返回值,调用函数将使用该值并获得意外结果。
显而易见,这些都不是您应该依赖的行为。最好使用编译器开关,这些开关指定您希望更严格地遵守标准并希望更多警告。(我希望这些是编译器的默认值。编写符合标准的代码是一种很好的做法。
-
因为 C 允许函数的隐式声明。 或者至少确实如此;C90可能需要声明,我不确定。 但既然不是声明函数是 C 语言中很长一段时间的常见做法,我希望大多数编译器继续允许它,即使在它是禁止。
-
因为 C 和 C++ 是不同的语言。 C++从不允许隐式声明函数。
-
因为从历史上看,C 没有
void
类型;函数没有返回值被声明为int
,即使它们没有返回任何内容,只要您不尝试使用(不存在)返回值。
错误不会显示在 C 中,因为您在调用编译器时没有使用正确的标志。
你的编译器是什么?
如果是gcc
,请尝试gcc -std=c99 -pedantic -Werror ...
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?