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

标签 c include clang llvm-clang

我有两个用 C 编写的文件,其中第一个文件包含几个已在第二个文件中实现的函数的不同实现。有什么方法可以告诉 clang——“如果某个函数已经在 File1 中实现,则使用该实现而不是 File2 实现” ?我知道这是一个糟糕的想法,脆弱、晦涩……但我仍然想知道编译器是否对这种误用/滥用持开放态度?

最佳答案

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

编辑:

这是“so1.c”:

#include <stdio.h>

void f(void) {
  puts("One.");
}

这是“so2.c”:

#include <stdio.h>

void f(void) {
  puts("2!");
}

这是“som.c”(f() 的声明可能在一个额外的头文件中):

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_

clang so1.o so2.o som.o -o so12 没有链接,并给出了预期的错误。

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

关于C:如果已经定义,则忽略函数的第二个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56476846/

相关文章:

C double 到指数舍入误差

c - 如何使用 C 在加速度计中注册监听器

c - ruby 1.8 中缺少函数

c++ - 带有MinGW STL的Clang(错误: no member named 'fgetws' in the global namespace)

c++ - clang++ C++0x std::locale

c++ - Windows10 上的 LLD 链接错误 : no input files when trying to link with libcmt. lib

c - 错误: expected expression before

c - 分配大量虚拟内存失败

c - 在包含目录中找不到 Visual Studio Code 包含文件 (Windows 10)

c++ - 如何包含文件夹中的所有源文件? (C++,MS VS 2013)