私は2つの異なるもののチェックサムを取る関数を書いています。 2つはアーカイブエントリla BSD libarchiveライブラリです。私はGNUのcoreutilsからチェックサムコードを借りました。ファイルのチェックサムを行うためC:コードの重複の例
私のコードは次のようにそのソースからの読み込み:アーカイブエントリから読み込むための私のコードで
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
を入力することでそれを実行できますが、それは醜いようです。
この特定の例では、関数のコードはあまり長くないので、コードを複製するだけではあまり問題はありません。私はちょうど洗練されたソリューションが存在するかどうか疑問に思います。