我有以下两个文件:
file1.c中
int main(){
foo();
return 0;
}
file2.c中
void foo(){
}
我是否可以将这两个文件一起编译和链接,以便file1.c
能够识别foo
函数而不添加extern
?
更新了原型。
gcc file1.c file2.c throws:warning:函数foo的隐式声明。
答案 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的内容。话虽如此,这是一个糟糕的选择,除了最简单的程序之外,它们都会被打破。