これは、@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コンパイラにさまざまなオプションを提供することで(ここでは設定を通じて)、必要に応じて同時にリンクできるライブラリの2つまたは3つのバージョンを簡単に作成できます。
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
を使用している場合、または同様のものを使用している場合、これは自然なビルドターゲットです。同時に使用できるようにするには、同じメソッドを使用してすべてのグローバル変数の名前も変更する必要があります。
このソリューションには、次の3つの主要なポイントがあります。
- 醜い名前変更ビジネスは1つのファイルに隠すことができ、実際のソースファイルを編集する必要はありません。特に、ソースファイルを乱雑にする必要はありませんが、クリーンで読みやすくすることができます。
- いくつかの単純な原則に従うと、名前の変更を簡単に自動化できます(ヘッダーファイルとヘッダーファイルのコーディング規則に従って、すべてのグローバル変数と関数が宣言されます)。
- テストプログラムを複数回実行する必要があるため、ベンチマークをより面倒にする理由はありません(これは、私と同じように怠惰で、私と同じように繰り返しのタスクが嫌いな場合に関係します-多くの人が気にしないことを知っています、それはやや好みの問題)。