将多个.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上探讨了类似的问题。我找不到他们在那里问确切的问题。
答案 0 :(得分:2)
首先,包括源文件通常不是一个好主意。
对于问题本身,您可以通过假装编写头文件来轻松解决,而可以将所有声明,结构定义和宏写在源文件中。然后将其复制粘贴到需要它的其他源文件中。
但是,这非常重要,但是,这非常容易出错。如果函数的签名(例如,参数列表)发生更改,或者结构被修改,或者宏获得不同的值,那么您必须记住要修改此 everywhere 。如果您有多个源文件,则很容易错过其中一个文件。
如果调用了具有错误签名的函数,或者您具有的结构不是彼此逐个字符的复制,则将导致inverse。宏可能不匹配并不是很严重,但是,例如,如果更改了数组限制,那么很容易超出您想更新宏的范围。
简而言之:可能,但不是个好主意。将一个或多个头文件用于常见的声明,结构和宏。