文件:A(主),B
我了解到B的功能不能在A中使用 功能定义。
但是我的代码可以正常运行带有函数定义的A,B文件
这是我的代码:
B.c
void a()
{
printf("hi");
}
A
#include <stdio.h>
void main()
{
a();
}
是什么?我很困惑。
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
附录... 不好意思,我很抱歉。 我的代码很好地处理了错误。 但我看不到错误。
但是我还有更多问题要问 '无效a();' 'extern void a();'
答案 0 :(得分:5)
从前,C不需要事先声明所有功能。许多编译器仍然让您逃脱这个挑战。
在文件A.c
中,当您调用
a();
a
是编译器从未见过的函数,编译器认为该声明
extern int a();
在范围内。也就是说,编译器假定a
是一个带有未指定参数并返回int
的函数。
或者,曾经是规则。该规则不再存在于C中,所以是的,您应该在调用函数之前显式声明 all 。当今大多数编译器在应用旧规则时都会向您发出警告,并且许多人根本不愿意或至少不愿应用该规则,除非您使用非默认选项标志来请求它们。但是听起来您的编译器仍然愿意在没有警告或错误的情况下应用该规则。如果您要编译一堆非常旧的代码,那很好,但是如果您想学习现代C的话,那不是那么好。
现在,在这种情况下,您还遇到另一个问题,即文件a
中函数B.c
的 actual 定义将其定义为返回void
,而不是{ {1}},因此从理论上讲也是错误的。但是,实际上,错误地声明(或错误调用)int
-与void
-返回函数的错误是无害的,不会引起任何实际问题。 (不过,这仍然是错误的,值得避免。)
我想您知道这一点,但是正确的设置要么是使文件int
像这样:
A.c
或者创建包含以下内容的文件#include <stdio.h>
extern void a(void);
int main()
{
a();
}
B.h
,然后使文件extern void a(void);
如下所示:
A.c
(请注意,为了正确起见,我也将#include <stdio.h>
#include "B.h"
int main()
{
a();
}
更改为void main()
。如果您使用的是旧编译器,听起来很像,您可能还需要添加{ {1}末尾的{1}}。
附录。您还询问了该int main()
关键字。它与声明和定义之间的区别有关。但是,对于函数和全局变量,这种区别略有不同。
声明说明了某种类型的东西。定义解释了事物的类型,和,它们另外为事物分配内存,并提供其初始值。
这些是声明:
return 0;
这些是定义:
main()
关键字extern
明确表示:“这是一个声明,定义在其他地方。”对于全局变量,这有很大的不同。但是对于函数来说,当您说extern int i;
int f(int);
extern int f2(int, double);
时,编译器可以在发现int i;
int i2 = 2;
int f(int x) { return 2 * x; }
int f2(int n, double x) { return n * x; }
而不是extern
时告诉它这是一个声明(不是定义),因此关键字int f(int);
在函数声明中是可选的。
(此外,函数在C中始终是全局的;没有局部函数。)