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

Why the error of - calling the function before being declared, is not shown?

本文关键字:调用 函数 错误 声明 显示 为什么      更新时间:2023-10-16
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");

}

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

  2. C++是最近开发的,没有没有声明的功能遗留下来。

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

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

  1. 因为 C 允许函数的隐式声明。 或者至少确实如此;C90可能需要声明,我不确定。 但既然不是声明函数是 C 语言中很长一段时间的常见做法,我希望大多数编译器继续允许它,即使在它是禁止。

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

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

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

你的编译器是什么?

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