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");
}
答案 0 :(得分:4)
因为C允许隐式声明函数。或至少 它做了; C90可能需要声明,我不确定。但既然没有 声明功能在C中已经很常见了很长一段时间,我 我希望大多数编译器能够继续允许它,即使它已经存在 禁止。
因为C和C ++是不同的语言。 C ++从未允许过 隐含地声明函数。
因为从历史上看,C没有void
类型;功能没有
返回值被声明为int
,即使它们没有返回任何内容,
只要你不试图使用,就没有问题
(不存在的)返回值。
答案 1 :(得分:4)
旧版本的C编程语言允许没有早期声明的函数引用。作为遗产,许多当前的编译器仍然支持旧语言或其中的方面。这就是为什么有些编译器会接受您所显示的源代码的原因。您的编译器可能有开关,告诉它使用更新版本的C编程语言,或者更严格地遵守标准。
C ++最近开发出来,没有声明的功能遗产。
不同的返回类型有效,因为汇编语言碰巧以相同的方式实现。对于返回void的函数,被调用的例程只执行其操作并返回。对于返回int的函数,被调用例程执行其操作,将其最终结果放入特定的处理器寄存器,然后返回。在调用例程中,当未使用返回int的函数的返回值时,调用例程只是忽略处理器寄存器中的内容。因为忽略了寄存器,所以返回void的函数和返回int的函数之间的调用例程没有区别。所有目标平台都不会出现这种情况;具有不同返回类型的函数之间可能存在差异,尤其是当返回类型是更复杂的对象(例如结构)时。并且,如果调用函数确实使用了返回值,则返回类型会有所不同。返回void的函数会在处理器寄存器中留下一些不受控制的值,其中返回值应该是,并且调用函数将使用它并获得意外结果。
应该很明显,这些都不是你应该依赖的行为。最好使用编译器开关,指定您希望更严格地遵守标准,并希望获得更多警告。 (我希望这些是编译器的默认设置。)编写符合标准的代码是一种很好的做法。
答案 2 :(得分:0)
错误没有在C中显示,因为你没有在编译器的调用中使用正确的标志。
您的编译器是什么?
如果是gcc
,请尝试gcc -std=c99 -pedantic -Werror ...