首页 文章

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

提问于
浏览
1
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 回答

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

    • C最近开发,没有声明的功能遗留下来 .

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

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

  • 4
    • 因为C允许隐式声明函数 . 或者至少它确实如此; C90可能需要声明,我不确定 . 但是由于在很长一段时间内没有声明函数是C中的常见做法,我希望大多数编译器能够继续允许它,即使它被禁止 .

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

    • 因为历史上,C没有 void 类型;没有返回值的函数被声明为 int ,即使它们没有问题也没有问题,只要你不尝试使用(不存在的)返回值 .

  • 4

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

    What is your compiler?

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

相关问题