繁体   English   中英

编译程序中的多个C文件

[英]Compiling multiple C files in a program

我有以下两个文件:

在file1.c

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

file2.c中

void foo(){

 }

我可以编译和链接这两个文件,所以file1.c将识别foo函数而不添加extern

更新了原型。

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

正确的方法如下:

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 
$ 

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

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

int foo();  // add this declaration

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

可以 ,但你不应该。

使用头文件file2.h:

// file2.h

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

然后加:

#include "file2.h" 

在file1.c中

编译:

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

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

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

gcc -include file2.c file1.c

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM