main()
{
f();
}
int f( int i, float fl)
{
printf("function");
}
-
为什么上述代码在'C'中成功运行并在报告错误时打印
function
,因为f()在声明之前被调用 . -
当's running successfully in ' C ', then why not in ' C '. When running in c++ it'显示:
error: 'f' was not declared in this scope
-
如果是因为编译器假设一个未声明的函数返回一个int并接受一个未指定数量的参数,那么为什么它也成功运行下面的函数(即返回类型返回void而不是int?
void f(int i,float fl){printf(“function”);
}
3 回答
旧版本的C编程语言允许没有早期声明的函数引用 . 作为遗产,许多当前的编译器仍然支持旧语言或其中的方面 . 这就是为什么有些编译器会接受您所显示的源代码的原因 . 您的编译器可能有开关,告诉它使用更新版本的C编程语言,或者更严格地遵守标准 .
C最近开发,没有声明的功能遗留下来 .
不同的返回类型有效,因为汇编语言碰巧以相同的方式实现 . 对于返回void的函数,被调用的例程只执行其操作并返回 . 对于返回int的函数,被调用例程执行其操作,将其最终结果放入特定的处理器寄存器,然后返回 . 在调用例程中,当未使用返回int的函数的返回值时,调用例程只是忽略处理器寄存器中的内容 . 因为忽略了寄存器,所以返回void的函数和返回int的函数之间的调用例程没有区别 . 所有目标平台都不会出现这种情况;具有不同返回类型的函数之间可能存在差异,尤其是当返回类型是更复杂的对象(例如结构)时 . 并且,如果调用函数确实使用了返回值,则返回类型会有所不同 . 返回void的函数会在处理器寄存器中留下一些不受控制的值,其中返回值应该是,并且调用函数将使用它并获得意外结果 .
应该很明显,这些都不是你应该依赖的行为 . 最好使用编译器开关,指定您希望更严格地遵守标准,并希望获得更多警告 . (我希望这些是编译器的默认设置 . )编写符合标准的代码是一种很好的做法 .
因为C允许隐式声明函数 . 或者至少它确实如此; C90可能需要声明,我不确定 . 但是由于在很长一段时间内没有声明函数是C中的常见做法,我希望大多数编译器能够继续允许它,即使它被禁止 .
因为C和C是不同的语言 . C从未允许隐式声明函数 .
因为历史上,C没有
void
类型;没有返回值的函数被声明为int
,即使它们没有问题也没有问题,只要你不尝试使用(不存在的)返回值 .该错误未在C中显示,因为您没有在编译器的调用中使用正确的标志 .
What is your compiler?
如果是
gcc
,请尝试gcc -std=c99 -pedantic -Werror ...