我正在编写的函数采用两种不同的校验和:一,文件;和两个,归档条目 a la 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) { ... }
就目前而言,我必须在这里有两个不同的功能,即使大多数代码是相同的。我不太清楚如何通过传递函数指针来实现它,因为fread和archive_read_data甚至没有相同数量的参数。 (我想我可以先使用read(2)而不是fread(3),但我不确定这是一种有效的方法。)
这里有一个避免代码重复的好方法吗?除了尝试使用函数指针,我可以通过将相同的代码片段放在单独的文件中来实现
#including
'他们,但这看起来很难看。
在这个特定的例子中,函数的代码并不长,所以继续前进并复制代码并不是什么大不了的事。我只是想知道是否存在一个优雅的解决方案。
答案 0 :(得分:2)
您可以为fread()
和archive_read_data()
创建自己的包装函数,这些函数具有相同的原型。这些包装器中的每一个都只包含一行代码,用于调用基础read()
函数,根据需要重新排列参数。
然后使用函数指针根据上下文区分两个包装器。
答案 1 :(得分:1)
如果分析校验和的代码相同,则可以将其转换为函数 - 即大括号内的部分。在我看来,如果它们调用相同的函数,那么它有两个独立的循环并不是那么糟糕。它们可以被认为是一个薄的包装。
答案 2 :(得分:0)
这两个函数实际上只需要3个参数:
您可以为fread
编写一个包装函数,使其与archive_read_data
具有相同的签名(反之亦然):
ssize_t my_fread(FILE *fp, char *buf, int len) {
return fread(buf, 1, len, fp);
}