编译程序中的多个C文件

时间:2012-01-04 14:46:49

标签: c compilation linker

我有以下两个文件:

file1.c中

int main(){
  foo();
  return 0;
}

file2.c中

void foo(){

 }

我是否可以将这两个文件一起编译和链接,以便file1.c能够识别foo函数而不添加extern

更新了原型。

  

gcc file1.c file2.c throws:warning:函数foo的隐式声明。

4 个答案:

答案 0 :(得分:27)

正确的方法如下:

file1.c

#include <stdio.h>
#include "file2.h"

int main(void){
    printf("%s:%s:%d \n", __FILE__, __FUNCTION__, __LINE__);
    foo();
    return 0;
}

file2.h

void foo(void);

file2.c

#include <stdio.h>
#include "file2.h"

void foo(void) {
    printf("%s:%s:%d \n", __FILE__, __func__, __LINE__);
    return;
}

output

$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file 
file1.c:main:6 
file2.c:foo:6 
$ 

答案 1 :(得分:6)

可以,但你不应该。

使用头文件file2.h:

// file2.h

void foo(); // prototype for function foo()

然后添加:

#include "file2.h" 

在file1.c

编译:

$ gcc -Wall file1.c file2.c -o foo

作为一般规则,使用头文件定义每个模块接口而不是 ad hoc 更好(更强大)依赖模块中的原型。这有时被称为SPOT(单点真相)原则。

答案 2 :(得分:6)

您不需要extern,但file1.c必须看到foo()存在的声明。通常,此声明位于头文件中。

要在不使用头文件的情况下添加转发声明,只需将file1.c修改为:

int foo();  // add this declaration

int main(){
  foo();
  return 0;
}

答案 3 :(得分:2)

这很难看,但是使用gcc,你可以:

gcc -include file2.c file1.c

-include是预处理程序的标志,它将在file1.c的最顶部包含file2.c的内容。话虽如此,这是一个糟糕的选择,除了最简单的程序之外,它们都会被打破。