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++ - 为什么未显示 - 在声明之前调用函数的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11881300/