2
main()
{
    f();
}
int f( int i, float fl)
{
    printf("function");
}
  1. 为什么上面的代码在'C'中成功运行并function在应该报告错误时打印,因为在声明之前调用了f() 。

  2. 当它在'C'中成功运行时,为什么不在'C++'中。在 c++ 中运行时,它显示:error: 'f' was not declared in this scope

  3. 如果是因为编译器假定一个未声明的函数返回一个 int 并接受未指定数量的参数,那么为什么它也为下面的函数成功运行(即当返回类型为void而不是int时?

void f (int i, float fl)

{

    printf("function");

}

4

3 回答 3

4
  1. 因为 C 允许隐式声明函数。或者至少是这样;C90 可能需要声明,我不确定。但是由于长期以来不声明函数是 C 语言中的常见做法,我希望大多数编译器会继续允许它,即使在它被禁止之后也是如此。

  2. 因为 C 和 C++ 是不同的语言。C++ 从未允许隐式声明函数。

  3. 因为从历史上看,C 没有void类型;声明了没有返回值的函数int,即使它们没有返回任何内容,只要您不尝试使用(不存在的)返回值就没有问题。

于 2012-08-09T10:34:34.253 回答
4
  1. 旧版本的 C 编程语言允许没有更早声明的函数引用。作为遗留问题,许多当前的编译器仍然支持旧语言或它的某些方面。这就是为什么一些编译器接受您显示的源代码的原因。您的编译器可能有一些开关,告诉它使用更新版本的 C 编程语言,或者更严格地遵守标准。

  2. C++ 是最近开发的,没有没有声明的函数的遗留问题。

  3. 不同的返回类型起作用,因为汇编语言恰好以相同的方式实现。对于返回 void 的函数,被调用的例程只是执行其操作并返回。对于返回 int 的函数,被调用的例程执行其操作,将其最终结果放入特定的处理器寄存器,然后返回。在调用例程中,当不使用返回 int 的函数的返回值时,调用例程会简单地忽略处理器寄存器中的内容。因为寄存器被忽略,所以对于调用例程,返回 void 的函数和返回 int 的函数之间没有区别。并非所有目标平台都如此;具有不同返回类型的函数之间可能存在差异,尤其是当返回类型是更复杂的对象(例如结构)时。和,如果调用函数确实使用了返回值,则返回类型会有所不同。返回 void 的函数会在处理器寄存器中留下一些不受控制的值,返回值应该是,调用函数会使用它并得到意想不到的结果。

显而易见,这些都不是您应该依赖的行为。使用指定您希望更严格地遵守标准并希望获得更多警告的编译器开关是一种很好的做法。(我希望这些是编译器的默认值。)编写符合标准的代码是一种很好的做法。

于 2012-08-09T10:35:01.717 回答
0

该错误未在 C 中显示,因为您在调用编译器时没有使用正确的标志。

你的编译器是什么?

如果是gcc,试试gcc -std=c99 -pedantic -Werror ...

于 2012-08-09T10:27:31.893 回答