如何为C库函数添加别名?

Jos*_*itt 7 c

我有一个静态C库,我可以用不同的编译时选项构建(例如_BUILD_SMALL,_BUILD_FAST).它有一个功能

void Foo(void);
Run Code Online (Sandbox Code Playgroud)

我想使用基准测试工具的单个实例来对库的"小"和"快"版本进行基准测试.我不想使用.dlls.

如何链接到"小"和"快"库以及别名函数名称,以便我可以调用小版本和快速版本.理想情况下,它看起来像:

void benchmark(void)
{
  FAST_Foo();

  SMALL_Foo();
}
Run Code Online (Sandbox Code Playgroud)

更多信息:

可以使用不同的优化选项-Os与-O3构建库.此外,算法略有不同(即缓存值与始终查找值).我想比较不同版本的大小与速度权衡.我希望单元测试和基准测试能够以最简单的方式在库的两个版本上运行.

Foo*_*ooF 6

这只是@Micha 给出的方法的一种变体?Górny(我的评论空间用完了)...

您可以创建以下格式的包含文件:

/* Automatically created file - do not edit or ugly dinosaur will eat you */
#ifndef PREFIX
#  define RENAME(f)
#else
#  define RENAME(f) PREFIX ## f
#endif

/* list all the function and variables you want to rename here in one place */
#define func_foo RENAME(func_foo)
#define func_bar RENAME(func_bar)
/* ... many more ... */

#undef RENAME
Run Code Online (Sandbox Code Playgroud)

至少gcc允许您使用选项从命令行指定头文件的包含-include rename.h(假设此文件名为rename.h)。因为您使用gcc相似选项(-O3Os),所以我假设您gcc在本答案的其余部分中使用。否则,如果您的 C 编译器是合理的,您应该能够以某种类似的方式进行。

通过为 C 编译器提供不同的选项(此处通过CFLAGS设置),您可以轻松创建两个甚至三个版本的库,如果需要,可以同时链接这些版本:

CFLAGS += -include rename.h -DPREFIX=fast_ -D_BUILD_FAST -O3 -DBENCHMARKING
CFLAGS += -include rename.h -DPREFIX=small_ -D_BUILD_SMALL -Os -DBENCHMARKING
CFLAGS += -D_BUILD_FAST -O2
Run Code Online (Sandbox Code Playgroud)

如果您的库头文件看起来很规则,并且如果您声明了库私有函数static,那么很容易通过一些虚拟脚本使用非常简单的正则表达式从这些头文件中提取函数,以自动rename.h为您生成文件。如果您正在使用make或类似的东西,这是一个自然的构建目标。所有全局变量也需要使用相同的方法重命名以允许同时使用。

这个解决方案有三个要点:

  1. 丑陋的重命名业务可以隐藏在一个文件中,您不需要编辑实际的源文件- 特别是您不需要将源文件弄得杂乱无章,但可以保持它们干净且易于阅读。
  2. 如果您遵循一些简单的原则(头文件遵循编码约定,头文件将声明所有全局变量和函数),则可以轻松实现重命名。
  3. 没有理由需要多次运行您的测试程序来使基准测试变得更加繁琐(如果您像我一样懒惰并且像我一样强烈不喜欢重复性任务,这很重要-我知道很多人不在乎,这是有点偏好问题)。