编译程序中的多个C文件

mar*_*ary 14 c linker compilation

我有以下两个文件:

在file1.c

int main(){
  foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

file2.c中

void foo(){

 }
Run Code Online (Sandbox Code Playgroud)

我可以将两个文件编译并链接在一起,以便file1.c识别该foo功能而不添加extern吗?

更新了原型.

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

San*_*raj 31

正确的方法如下:

file1.c

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

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

file2.h

void foo(void);
Run Code Online (Sandbox Code Playgroud)

file2.c

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

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

output

$
$ gcc file1.c file2.c -o file -Wall
$
$ ./file 
file1.c:main:6 
file2.c:foo:6 
$ 
Run Code Online (Sandbox Code Playgroud)

  • @Minuet:它告诉编译器启用所有警告 - 编译器警告确实很有帮助且重要,特别是对于仍在学习该语言的人来说,但不幸的是默认情况下并未启用它们,始终在启用警告的情况下进行编译并注意任何警告编译器忽略的。 (2认同)

chr*_*ock 7

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

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

int foo();  // add this declaration

int main(){
  foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 6

可以,但你不应该.

使用头文件file2.h:

// file2.h

void foo(); // prototype for function foo()
Run Code Online (Sandbox Code Playgroud)

然后加:

#include "file2.h" 
Run Code Online (Sandbox Code Playgroud)

在file1.c中

编译:

$ gcc -Wall file1.c file2.c -o foo
Run Code Online (Sandbox Code Playgroud)

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

  • @Anonymous down-voter:请澄清你的反对意见? (3认同)