c中函数声明的范围

scope of function declaration in c

我在很多地方都读到,在 main() 中声明的函数不能在 main 之外调用。但是在下面的程序中,fun3() 是在 main() 内部声明的,并在其他函数的 main() 外部调用,它工作正常,给出输出 64.here 的 link http://code.geeksforgeeks.org/7EZZxQ 。但是,如果我将 fun3() return type int 更改为 void ,它无法编译,这是什么原因造成的?

#include <stdio.h>
 #include <stdlib.h>


int main()
{
    void fun1(int);
    void fun2(int);
    int fun3(int); 

    int num = 5;
    fun1(num);
    fun2(num);
}

void fun1(int no)
{
    no++;
    fun3(no);
}

void fun2(int no)
{
    no--;
    fun3(no);

}

int fun3(int n)
{
    printf("%d",n);
}

修改fun3()的声明时编译失败

 #include <stdio.h>
 #include <stdlib.h>


int main()
{
    void fun1(int);
    void fun2(int);
    void fun3(int);     //fun3 return type changed to void error in compilation

    int num = 5;
    fun1(num);
    fun2(num);
}

void fun1(int no)
{
    no++;
    fun3(no);
}

void fun2(int no)
{
    no--;
    fun3(no);

}

void fun3(int n)   //fun3 return type changed to void error in compilation
{
    printf("%d",n);
}

声明仅在它们声明的范围内有效。但是,在旧的 C 标准中,允许编译器猜测函数声明如果 none 在调用时存在,这可能是您的情况:编译器在 fun1fun2 和 [ 中看到 fun3 的调用=10=],并根据您在调用中传递的参数推断(猜测)参数类型。

在 C99 标准之前,如果编译器在同一作用域中看到函数 call 而没有函数 declaration,它假定函数返回 int

fun1fun2 在他们调用它之前都没有声明 fun3,他们也没有看到 main 中的声明; mainfun3 的声明仅限于 main 的正文。在 C89 和更早版本中,编译器将假设对 fun3 returns 的调用是 int。在第一个示例中,definition of fun3 returns an int 因此代码将在 C89 编译器下编译。在第二个示例中,fun3 returns void 的定义与假定的 int 类型不匹配,因此代码无法编译。

在 C99 及更高版本的标准下, 片段都不会编译;编译器不再假定函数调用的隐式 int 声明。 所有 函数必须在调用前显式声明或定义。