考虑以下代码:
main()
{
func();
i = 8;
}
int i;
func()
{
}
Run Code Online (Sandbox Code Playgroud)
我的主函数如何看到并调用func()但不能使用i,这也是在main下面定义的.
快速回答:不要这样做.应在使用前显式声明所有函数和变量.早期版本的C允许您使用隐式声明,但您不应该利用它.
在C89/C90中(有时称为"ANSI C",但并不严格准确),如果调用没有可见声明的函数,则会创建隐式声明,假设函数返回int并获取您传递的(提升的)类型的参数在通话中.对象没有这样的隐式声明.
根据这个规则是一个坏主意.如果函数实际返回的类型不是int,或者如果其参数与调用中传递的参数不匹配,则行为未定义,并且编译器没有义务告诉您出错.
所有被调用的函数在被调用之前都应该有一个显式声明,并且该声明应该是一个原型,指定参数的类型.
1999 ISO C标准删除了"隐式int"规则,使得调用没有可见声明的函数变得非法(违反约束).(不幸的是,声明不需要是原型,但你总是应该使用原型.)许多编译器仍允许使用旧规则进行调用.您应该了解如何让您的编译器至少警告这些调用.
这是您的程序的更正版本,在C89/C90,C99和C11中有效:
void func(void);
int i;
int main(void)
{
func();
i = 8;
}
void func(void)
{
}
Run Code Online (Sandbox Code Playgroud)
或者您可以简单地移动func上面定义的定义main(除非您有递归调用,否则通常不需要"前向声明"):
void func(void);
int i;
int main(void)
{
func();
i = 8;
}
void func(void)
{
}
Run Code Online (Sandbox Code Playgroud)