1

我有一个动态数组 ADT,其元素类型为 void*

// In dyn_array.h
typedef void* element;
void append(array *a, element e);
inline void set(array *a, int i, element e);
...
// dyn_array.c contains the implementation

这用于我程序的许多部分。当我向程序添加新功能时,现在我想要一个带有 int 元素而不是 void* 的动态数组。我知道其中一种解决方案可能是制作 dyn_arrayi.h 和 dyn_arrayi.c,它们的内容几乎与 dyn_array.h 和 dyn_array.c 相同,除了 typedef 语句和函数的名称。但这对我来说似乎不是一个优雅的解决方案,因为我显然是在毫无意义地重复自己。

有没有更好的解决方案,这样我就不需要重复自己了?也许编译不同版本的目标代码?你会怎么做呢?谢谢。

4

2 回答 2

1

这是 C++ 比 C 更擅长支持的东西。你能考虑用 C++ 代替吗?

无论如何,在 C 中你可以这样做:首先定义 dyn_array_generic.c 等,使用ARRAY_TYPE代替void*并使用合适的宏将定义的函数后缀添加FUNC_POSTFIX到每个函数名称中,然后在 dyn_array.c 等中执行以下操作:

#define ARRAY_TYPE void*
#define FUNC_POSTFIX 
#include "dyn_array_generic.c"
#undef FUNC_POSTFIX
#undef ARRAY_TYPE

并在 dyn_arrayi.c 等中执行以下操作:

#define ARRAY_TYPE int
#define FUNC_POSTFIX _int
#include "dyn_array_generic.c"
#undef FUNC_POSTFIX
#undef ARRAY_TYPE

#undef不是严格需要的,我只是认为它更清楚。

于 2013-05-28T11:33:13.710 回答
0

已经尝试过宏?

你可以尝试一个简单的#ifdef

#define DEFINE_MY_TYPE(tp) \
typedef (tp) elem;

#define FUNCTION_APPEND(func_name) \
void func_name(array *a, elem e);


#define FUNCTION_SET(func_name) \
void func_name(array *a, elem e);

#ifdef USE_INT
DEFINE_MY_TYPE(int)
#elif USE_VOID
DEFINE_MY_TYPE(void *)
#endif

您可以使用宏定义整个函数。

#define FUNCTION_APPEND(func_name) \
void func_name(array *a, elem e){  \
    int a,b,c, \
    ...        \
    return 0;  \
}

FUNCTION_APPEND(append_int)

int main (int argc, char *argv[]){
{
    ....
    append_int(NULL, 0);  //using function defined with MACRO
    ...
    return 0;
}

或者,根据您打算如何使用这些宏,您可以尝试使用 X 宏技术(http://en.wikipedia.org/wiki/X_Macro),但在实际使用之前请通过 Google 获取更多信息。

于 2013-05-28T11:21:55.013 回答