在C语言中编译多个源文件

3

假设我们有两个源文件:

#include <stdio.h>
#define i 2

int main(){
    printf("sum(%d) = %d", i, sum(i));
    return 0;
}

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函数在main之后,没有任何关于sum函数的提示,就像在main之前声明一样。
这是因为编译步骤之一(如链接编辑)吗?此外,这是一种不好的做法吗(我应该使用带有sum声明的头文件)?

2
#define <stdio.h> 这是什么?应该是 #include<stdio.h>。 - Jeegar Patel
2个回答

8
我很困惑,因为我认为这不应该起作用,因为sum函数在main之后,没有暗示sum函数的存在,就像它在main之前声明一样。
当没有声明时,编译器会假定存在一个返回int的这样的函数(幸运的是,在这种情况下确实是这样),链接器会找到所需的符号,但还是...
这是因为编译步骤之一(如链接编辑)吗?
是的,链接器尝试从编译中解析未解析的符号。
这是一种不好的做法吗(我应该使用带有sum声明的头文件)?
是的,你应该,或者在main之前声明函数。

2

应该使用头文件。这是在C语言中导出程序库的函数/API的方法。

编译工作是因为链接器在跟随使用该函数的文件后寻找函数定义。由于在sum.c中找到了它,链接器就可以继续工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接