为什么没有显示 - 在声明之前调用函数的错误?

时间:2012-08-09 10:23:23

标签: c++ c function

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

  4.   

    void f(int i,float fl)

         

    {

        printf("function");
    
         

    }

3 个答案:

答案 0 :(得分:4)

  1. 因为C允许隐式声明函数。或至少 它做了; C90可能需要声明,我不确定。但既然没有 声明功能在C中已经很常见了很长一段时间,我 我希望大多数编译器能够继续允许它,即使它已经存在 禁止。

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

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

答案 1 :(得分:4)

  1. 旧版本的C编程语言允许没有早期声明的函数引用。作为遗产,许多当前的编译器仍然支持旧语言或其中的方面。这就是为什么有些编译器会接受您所显示的源代码的原因。您的编译器可能有开关,告诉它使用更新版本的C编程语言,或者更严格地遵守标准。

  2. C ++最近开发出来,没有声明的功能遗产。

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

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

答案 2 :(得分:0)

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

您的编译器是什么?

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