【问题标题】:Compiling multiple sources in C在 C 中编译多个源
【发布时间】:2011-08-02 06:10:17
【问题描述】:

假设我们有 2 个源文件:

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

int main(){
    printf("sum(%d) = %d", i, sum(i));
    return 0;
}
总和.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 函数出现在main 之后> 没有sum 函数的提示,就像它在main 之前的声明一样。

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

【问题讨论】:

  • #define 这是什么..???应该有#include

标签: c gcc compilation


【解决方案1】:

我很困惑,因为我认为这不应该工作,因为总和 函数在 main 之后 > 没有 sum 函数的提示,比如 这是main之前的声明。

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

这是因为编译步骤之一(如链接编辑)吗?

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

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

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

【讨论】:

    【解决方案2】:

    应该已经使用了头文件。这就是您可以在 C 中导出程序库的函数/API 的方式。

    编译它是有效的,因为链接器会在使用它的文件后面的文件中查找函数的定义。由于在 sum.c 中找到它,因此链接器继续运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2014-04-13
      • 1970-01-01
      相关资源
      最近更新 更多