假设我们有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声明的头文件)吗?
我很困惑,因为我认为这不应该工作,因为sum函数出现在main>之后没有提示sum函数,就像它在main之前的声明一样.
当没有声明时,编译器假定有这样的函数返回一个int(幸运的是,这就是这里的情况)并且链接器找到所需的符号,但仍然......
这是因为其中一个编译步骤(如链接编辑)?
是的,链接器尝试从编译中解析未解析的符号.
这是一个不好的做法(我应该使用带有sum声明的头文件)?
是的,你应该,或在main之前声明函数.