这只是@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
至少gcc
允许您使用选项从命令行指定包含头文件-include rename.h
(假设此文件称为rename.h
)。因为您使用gcc
相似选项(-O3
和Os
),所以我假设您gcc
在此答案的其余部分中使用。否则,如果你的 C 编译器是合理的,你应该能够以类似的方式来做。
CFLAGS
通过为 C 编译器提供不同的选项(此处通过设置),您可以轻松创建可以同时链接的两个甚至三个版本的库:
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
如果您的库头文件看起来非常规则,并且如果您声明了库私有函数static
,那么很容易通过一些虚拟脚本使用非常简单的正则表达式从这些头文件中提取函数以自动rename.h
为您生成文件。如果您正在使用make
或类似的东西,这是一个自然的构建目标。所有全局变量也需要使用相同的方法重命名以允许同时使用。
这个解决方案有三个要点:
- 丑陋的重命名业务可以隐藏在一个文件中,您不需要编辑实际的源文件——尤其是您不需要弄乱源文件,但可以保持它们的干净和易于阅读。
- 如果您遵循一些简单的原则(头文件遵循的编码约定,并且头文件将声明所有全局变量和函数),重命名可以很容易地自动化。
- 没有理由需要多次运行您的测试程序来使基准测试变得更加麻烦(如果您像我一样懒惰并且像我一样不喜欢重复性任务,这是相关的 - 我知道很多人不在乎,这是有点偏好)。