我正在编写函数来获取两个不同事物的校验和:一个是文件;另一个是文件。第二,一个 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) 开始,但我不确定这是一种有效的方法。)
有没有一个好的方法可以避免这里的代码重复?除了尝试使用函数指针来完成此操作之外,我还可以通过将相同的代码片段放在单独的文件中,然后
#include
'ing 他们,但这看起来很难看。
在这个特定的示例中,函数的代码并不长,因此继续复制代码并不是什么大问题。我只是想知道是否存在一个优雅的解决方案。
最佳答案
您可以为具有相同原型(prototype)的 fread()
和 archive_read_data()
创建自己的包装函数。每个包装器都只包含一行代码,用于调用底层的 read() 函数,根据需要重新排列参数。
然后使用函数指针根据上下文区分两个包装器。
关于C:代码重复示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10096090/