相同的指令集,不同的类型。如何处理?

时间:2012-03-10 16:32:03

标签: c generic-programming

在我正在编写的C程序中,我将接收命令行参数文件路径和字母。该文件是我从中读取数据的位置,该字母表示该文件中保存的数据类型。

我需要对数据执行的指令基本相同,只是类型不同:可能是文件包含int s,double s或结构的值{ {1}}。无论类型如何,操作都是相同的;我该如何避免重复代码?在C ++中,我会用模板处理这个问题。这通常如何在C中处理?

4 个答案:

答案 0 :(得分:0)

在C中你会通过你希望避免的东西来做 - 重复代码。正如您所知,C ++使模板更方便,但这只是重复代码并以不同类型为基础的简单方法。

可能适合您的是提供不同的类功能,但不要直接调用它们。相反,根据您的命令行,确定哪个(哪些)函数将处理您的数据,并将它们分配给函数指针。然后,您的控制循环将一般使用那些指针调用处理函数。这显然包括您对数据执行的操作,但您可能还决定根据数据类型使用单独的输入函数。

编辑:正如Mat所说,有些类型可以很好地推广,因此一段代码可以正常工作。我怀疑这就是你的任务包括使用某种结构类型的原因。

答案 1 :(得分:0)

对于这个问题的解决方案,对于现代的面向对象语言来说是显而易见的 - 你创建了一个每个类型的对象,它实现了你想要执行的动作的接口(或通过继承)。

你不能在C中这样做,因为语言并不天真地支持面向对象,但你可以“重现”相同的功能,而不是让编译器为你做。为此,您需要使用一个间接级别,特别是您需要使用函数指针。

因此(作为示例)您可能采取的一个操作是从文件中读取值。你的一个变量是一个函数指针,它指向一个函数,该函数将文件和void类型的变量作为参数(这将为你编写的每个函数改变。)为每个类型编写函数,然后在运行类型赋值基于文件类型使用的函数。

答案 2 :(得分:0)

在真正丑陋的预处理器技巧领域,如果你想为不同类型复制函数体,但保持代码“结构”相同,你可以这样做:

foo.hc

#define YNAME(X) foo_ ## X
#define XNAME(X) YNAME(X)
#define NAME XNAME(TYPE)

int NAME(FILE* f) {
    TYPE myvar;
    ...
    return whatever;
}

foo.c的

#define TYPE int
#include "foo.hc"
#undef TYPE

#define TYPE double
#include "foo.hc"
#undef TYPE

foo.c将预先处理为:

int foo_int(FILE* f) {
    int myvar;
    ...
    return whatever;
}

int foo_double(FILE* f) {
    double myvar;
    ...
    return whatever;
}

您在主处理循环中需要做的就是根据文件类型调度到正确的函数。一个普通的switch语句可以很好地工作,函数指针数组也可以工作。

答案 3 :(得分:0)

新的C标准C11具有可用于此的类型泛型表达式。目前还没有很多编译器支持C11,但例如最新版本的clang有_Generic。您还可以使用P99在gcc提供的类似扩展程序之上模拟C11功能。