私は 2 つの異なるもののチェックサムを取る関数を書いています。1 つはファイルです。もう 1 つは、BSD libarchiveライブラリのようなアーカイブ エントリです。GNU の coreutils からチェックサム コードを借りました。
ファイルのチェックサムを実行するための私のコードは、次のようにソースから読み取ります。
unsigned char buf[BUFLEN];
size_t bytes_read;
FILE *fp;
...
while ((bytes_read = fread (buf, 1, BUFLEN, fp)) > 0) { ... }
アーカイブ エントリから読み取るコードでは、対応するコードは次のようになります。
struct archive *ar;
unsigned char buf[BUFLEN];
ssize_t bytes_read;
...
while ((bytes_read = archive_read_data(ar, buf, sizeof(buf))) > 0) { ... }
現状では、コードの大部分は同じですが、ここでは 2 つの異なる関数を用意する必要があります。fread と archive_read_data には同じ数の引数さえないため、関数ポインターを渡すことによってそれを行う方法がよくわかりません。(fread(3) の代わりに read(2) を使用して開始できると思いますが、それが生産的な方法であるかどうかはわかりません。)
ここでコードの重複を避ける良い方法はありますか? 関数ポインタを使ってそれをやろうとする以外に、同じコードの断片を別々のファイルに入れてから
#including
'ing' することでそれを行うことができましたが、それは醜いようです。
この特定の例では、関数のコードはそれほど長くないため、先に進んでコードを複製することはそれほど大したことではありません。エレガントなソリューションが存在するかどうか疑問に思っています。