C:代码重复示例

标签 c function-pointers code-duplication

我正在编写函数来获取两个不同事物的校验和:一个是文件;另一个是文件。第二,一个 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/

相关文章:

c# - 多个项目之间的重复功能

java - 比较哪里

c - 字符串中的重复字符

javascript - 自修改功能不好吗?

if-statement - Svelte 中是否有更好的方法来包含条件 HTML 元素

c++ - 将 for_each 调用的函数放在类中的什么位置?

c++ - 是否可以在未计算的上下文中从 STD 形成指向不可寻址函数的指针?

可由文件控制的C调试器

C中的客户端服务器多个连接

c - 为什么对与位置无关的代码函数调用使用惰性绑定(bind)