【问题标题】:C: code duplication exampleC:代码重复示例
【发布时间】:2012-04-10 20:37:21
【问题描述】:

我正在编写对两个不同事物进行校验和的函数:一个是文件;另一个是文件。第二,BSD libarchive 库的归档条目a la。我从 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'ing 他们,但这看起来很难看。

在这个特定的示例中,函数的代码并没有那么长,所以继续复制代码并不是什么大问题。我只是想知道是否存在优雅的解决方案。

【问题讨论】:

    标签: c function-pointers code-duplication


    【解决方案1】:

    您可以为具有相同原型的fread()archive_read_data() 创建自己的包装函数。这些包装器中的每一个都只包含一行代码,用于调用底层的read() 函数,并根据需要重新排列参数。

    然后根据上下文使用函数指针来区分两个包装器。

    【讨论】:

      【解决方案2】:

      如果分析校验和的代码是一样的,你可以把它变成一个函数——也就是花括号里面的部分。在我看来,如果它们调用相同的函数,那么拥有两个独立的循环并不是那么糟糕。它们可以被视为一个薄包装。

      【讨论】:

        【解决方案3】:

        这两个函数实际上只需要 3 个参数:

        • 指向数据源的指针
        • 指向数据缓冲区的指针
        • 要读取的字节数

        您可以为fread 编写一个包装函数,为其赋予与archive_read_data 相同的签名(反之亦然):

        ssize_t my_fread(FILE *fp, char *buf, int len) {
          return fread(buf, 1, len, fp);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多