是否可以在不创建头文件的情况下编译多个相关的C文件?

时间:2020-07-06 03:54:37

标签: c compilation

将多个.c文件放在一起时遇到一些问题。 我将使用以下文件模仿我的情况。

mod.c

#include <stdio.h>
void print_hello() {
  printf("Hello!");
}

mod_main.c

#include "mod.c"
int main() {
  print_hello();
}

编译方案:

#1

$ cc -o mod_main mod_main.c
# No errors

#2

$ cc -c -o mod_main.o mod_main.c
$ cc -c -o mod.o mod.c
$ cc -o mod_main mod.o mod_main.o
duplicate symbol '_print_hello' in:
    mod.o
    mod_main.o
ld: 1 duplicate symbol for architecture x86_64

#3

$ cc -o mod_main mod.c mod_main.c
duplicate symbol '_print_hello' in:

基于这些尝试,我得出结论,我可以简单地编译mod_main.c并使其工作。或者,我可以如下创建一个.h文件并使其正常工作。

mod.h

void print_hello(void);

mod.c

#include <stdio.h>
#include "mod.h"
void print_hello() {
  printf("Hello!");
}

mod_main.c

#include "mod.h"
int main() {
  print_hello();
}

我想知道,是否还有其他方法可以编译相互依赖的多个C文件。确切地说,是否有避免写头文件的不错方法?

美好的一天!

PS:我在StackOverflow上探讨了类似的问题。我找不到他们在那里问确切的问题。

1 个答案:

答案 0 :(得分:2)

首先,包括源文件通常不是一个好主意。

对于问题本身,您可以通过假装编写头文件来轻松解决,而可以将所有声明,结构定义和宏写在源文件中。然后将其复制粘贴到需要它的其他源文件中。

但是,这非常重要,但是,这非常容易出错。如果函数的签名(例如,参数列表)发生更改,或者结构被修改,或者宏获得不同的值,那么您必须记住要修改此 everywhere 。如果您有多个源文件,则很容易错过其中一个文件。

如果调用了具有错误签名的函数,或者您具有的结构不是彼此逐个字符的复制,则将导致inverse。宏可能不匹配并不是很严重,但是,例如,如果更改了数组限制,那么很容易超出您想更新宏的范围。

简而言之:可能,但不是个好主意。将一个或多个头文件用于常见的声明,结构和宏。

相关问题