C:代码重复示例

时间:2012-04-10 20:37:21

标签: c function-pointers code-duplication

我正在编写的函数采用两种不同的校验和:一,文件;和两个,归档条目 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'他们,但这看起来很难看。

在这个特定的例子中,函数的代码并不长,所以继续前进并复制代码并不是什么大不了的事。我只是想知道是否存在一个优雅的解决方案。

3 个答案:

答案 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);
}