假设我们有2个源文件:
main.c中:#include <stdio.h>
#define i 2
int main(){
printf("sum(%d) = %d", i, sum(i));
return 0;
}
sum.c:
int sum(int i){
int a, sum;
for(a = 0, sum = 0; a < i; a++)
sum += a;
return sum;
}
如果我使用
编译它们gcc main.c sum.c
我将获得一个可用的可执行文件。我很困惑,因为我认为这不应该起作用,因为sum
&gt;之后main
函数出现了。没有sum
函数的提示,就像它在main
之前的声明一样。
这是因为其中一个编译步骤(如链接编辑)?另外,这是一个不好的做法(我应该使用带有sum
声明的头文件吗?)
答案 0 :(得分:8)
我很困惑,因为我认为这不应该起作用 功能来自主要&gt;没有提示和功能,比如 它是在main之前的声明。
当没有声明时,编译器假定有这样的函数返回int
(幸运的是,这就是这里的情况)并且链接器找到所需的符号,但仍然...
这是因为其中一个编译步骤(如链接编辑)?
是的,链接器尝试从编译中解析未解析的符号。
这是一个不好的做法(我应该使用带有sum的头文件 声明)?
是的,你应该在main之前声明这个功能。
答案 1 :(得分:2)
应该使用头文件。这是您可以在C中导出程序库的函数/ API的方法。
编译它的工作原理是因为链接器在使用它的文件后面查找函数的定义。因为它在sum.c中找到,所以链接器继续工作。