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 在调用时存在,这可能是您的情况:编译器在 fun1
、fun2
和 [ 中看到 fun3
的调用=10=],并根据您在调用中传递的参数推断(猜测)参数类型。
在 C99 标准之前,如果编译器在同一作用域中看到函数 call 而没有函数 declaration,它假定函数返回 int
。
fun1
和 fun2
在他们调用它之前都没有声明 fun3
,他们也没有看到 main
中的声明; main
中 fun3
的声明仅限于 main
的正文。在 C89 和更早版本中,编译器将假设对 fun3
returns 的调用是 int
。在第一个示例中,definition of fun3
returns an int
因此代码将在 C89 编译器下编译。在第二个示例中,fun3
returns void
的定义与假定的 int
类型不匹配,因此代码无法编译。
在 C99 及更高版本的标准下, 片段都不会编译;编译器不再假定函数调用的隐式 int
声明。 所有 函数必须在调用前显式声明或定义。
我在很多地方都读到,在 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 在调用时存在,这可能是您的情况:编译器在 fun1
、fun2
和 [ 中看到 fun3
的调用=10=],并根据您在调用中传递的参数推断(猜测)参数类型。
在 C99 标准之前,如果编译器在同一作用域中看到函数 call 而没有函数 declaration,它假定函数返回 int
。
fun1
和 fun2
在他们调用它之前都没有声明 fun3
,他们也没有看到 main
中的声明; main
中 fun3
的声明仅限于 main
的正文。在 C89 和更早版本中,编译器将假设对 fun3
returns 的调用是 int
。在第一个示例中,definition of fun3
returns an int
因此代码将在 C89 编译器下编译。在第二个示例中,fun3
returns void
的定义与假定的 int
类型不匹配,因此代码无法编译。
在 C99 及更高版本的标准下, 片段都不会编译;编译器不再假定函数调用的隐式 int
声明。 所有 函数必须在调用前显式声明或定义。