C:忽略函数的第二个定义(如果已经定义)

C:忽略函数的第二个定义(如果已经定义),c,include,clang,llvm-clang,C,Include,Clang,Llvm Clang,我有两个用C编写的文件,其中第一个文件包含第二个文件中已经实现的几个函数的不同实现。有没有办法告诉clang-如果函数已经在File1中实现,那么使用该实现而不是File2实现?我知道这是一个可怕的想法,脆弱,晦涩。。。但是我仍然想知道编译器是否会被这样的误用/滥用?如果你把次函数放在一个库中,并链接到次函数的目标文件和这个库,链接器会忽略次函数 编辑: 这是so1.c: #include <stdio.h> void f(void) { puts("One."); } 以下

我有两个用C编写的文件,其中第一个文件包含第二个文件中已经实现的几个函数的不同实现。有没有办法告诉clang-如果函数已经在File1中实现,那么使用该实现而不是File2实现?我知道这是一个可怕的想法,脆弱,晦涩。。。但是我仍然想知道编译器是否会被这样的误用/滥用?

如果你把次函数放在一个库中,并链接到次函数的目标文件和这个库,链接器会忽略次函数

编辑: 这是so1.c:

#include <stdio.h>

void f(void) {
  puts("One.");
}
以下是检查此项的命令:

clang -c so1.c -o so1.o
clang -c so2.c -o so2.o
clang -c som.c -o som.o
ar r so1.lib so1.o
ar r so2.lib so2.o
clang so1.o   so2.o   som.o -o so12
clang so1.lib so2.o   som.o -o so_2
clang so1.o   so2.lib som.o -o so1_
so_2
so1_
正如预期的那样,clangso1.os2.osom.o-oso12行没有链接,并给出了一个错误

这两个可执行文件都能按预期工作。

您可能可以使用define和ifndef来完成类似头保护的工作。在第一个实现期间定义名称,然后在允许运行第二个定义之前检查名称是否存在。然后按优先顺序将它们包括在内。但是,如何才能不知道第一个文件中是否存在定义?
void f(void);

int main(void) {
  f();
  return 0;
}
clang -c so1.c -o so1.o
clang -c so2.c -o so2.o
clang -c som.c -o som.o
ar r so1.lib so1.o
ar r so2.lib so2.o
clang so1.o   so2.o   som.o -o so12
clang so1.lib so2.o   som.o -o so_2
clang so1.o   so2.lib som.o -o so1_
so_2
so1_