在C中编译多个源

Mih*_*csu 3 c gcc compilation

假设我们有2个源文件:

main.c中:
#include <stdio.h>
#define i 2

int main(){
    printf("sum(%d) = %d", i, sum(i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud) sum.c:
int sum(int i){
    int a, sum;
    for(a = 0, sum = 0; a < i; a++)
        sum += a;
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用它编译它们

gcc main.c sum.c 
Run Code Online (Sandbox Code Playgroud)

我将获得一个有效的可执行文件.我很困惑,因为我认为这不应该工作,因为sum函数来了main>没有提示sum函数,就像之前的声明一样main.

这是因为其中一个编译步骤(如链接编辑)?另外,这是一个不好的做法(我应该使用带sum声明的头文件)吗?

MBy*_*ByD 8

我很困惑,因为我认为这不应该工作,因为sum函数出现在main>之后没有提示sum函数,就像它在main之前的声明一样.

当没有声明时,编译器假定有这样的函数返回一个int(幸运的是,这就是这里的情况)并且链接器找到所需的符号,但仍然......

这是因为其中一个编译步骤(如链接编辑)?

是的,链接器尝试从编译中解析未解析的符号.

这是一个不好的做法(我应该使用带有sum声明的头文件)?

是的,你应该,或在main之前声明函数.