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

// 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ôarray I.h和dynôarrayi.c,其内容几乎与dynôarray.h和dynôarray.c相同,除了typedef语句和函数名。但对我来说,这似乎不是一个优雅的解决方案,因为我显然在毫无意义地重复自己。
有没有更好的办法让我不必再重复一遍?也许编译不同版本的目标代码?你到底会怎么做?谢谢。

最佳答案

这是C++比C.更能支持的东西,你能考虑C++吗?
无论如何,在C中可以这样做:首先使用ARRAY_TYPE代替void*定义dyn_array_generic.C,然后使用适当的宏将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我只是觉得它更清晰。

关于c - 如何在同一程序中以不同的typedef重用同一段C代码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16790303/

10-09 09:05