我有两个源文件test1.c
和test2.c
。
在test1.c
:
#include <stdio.h>
void main() {
checks(); }
在test2.c
:
#include <stdio.h>
void checks(){
printf("This is a sample Text");
}
在这种情况下,我可以成功构建并运行该程序。
那么我为什么要使用:
void checks();
要声明功能?
现在看来还不错。
我正在使用C99。
在您的情况下,该check()
函数具有非常简单的原型,C编译器应用的默认原型是接受任何内容作为参数并返回int
。可能是在这里完成的(除非,因为您不存储函数的结果而没有注意到它就被优化了)。
如果您想验证我的理论,请尝试编写以下内容(它应该工作到到达链接阶段为止):
int result = check();
最后,您的代码可以正常工作,因为链接器最终找到了可以对该check()
函数进行插入的东西(但是,int
在某个时候它仍然应该期望有一个)。
实际上,函数原型的声明仅在两种情况下有用:
该函数的代码和该函数的使用位于同一文件中。
当在声明函数之前使用该函数(代码源)时,则需要告诉编译器在尝试静态键入正在编写的函数时会发生什么(编译器从上至下读取源代码文件)。
例如:
int bar (int a, int b, bool c);
int foo (int a, bool b) {
int result = bar (a, a, c);
...
}
int bar (int a, int b, bool c) {
...
}
该函数的代码与该函数的使用不在同一个文件中。
然后,通常可以通过头文件获得函数的定义,该头文件收集编译器所需的所有信息,以了解如何静态键入代码。头文件(*.h
)包含您正在使用的模块功能的所有原型。功能的实现将在链接时进行。
请注意,我通常尝试避免第一种情况,因为这确实不合逻辑。当您阅读源代码时,就像编译器一样,您从头到尾都在寻找,并且希望在使用函数之前先找到函数定义...因此,以一种可以不需要这样的工件。在我的愚见...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句