哪种方式更适合在C中创建与类型无关的结构?

7 c types generic-programming

我正在尝试编写一些通用结构.基本上,我需要的是C++模板,但由于我是用C语言编写的,因此不考虑模板.目前我正在考虑实现我想要的两种方式.

方法1:使用预处理器.像这样:

#define DEFINE_PAIR(T) typedef struct Pair_##T{ \
                           T x; \
                           T y; \
                        } Pair_##T

DEFINE_PAIR(int);

int main(){
   Pair_int p;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个明显的缺点是你必须在使用类型之前调用宏.可能还有更多的缺点,我希望你能指出.

方法2:只使用void-pointers,如下所示:

typedef struct Pair{
   void* x;
   void* y;
} Pair;
Run Code Online (Sandbox Code Playgroud)

显然,这种方法不是类型安全的(我可以轻松地将一对字符串传递给期望一对双精度的函数),而且使用这种方法进行重新分配的代码变得更加混乱.

我想听听你对此的看法.这两种方法中哪一种更好/更差?为什么?有没有其他方法可以用来在C中编写通用结构?

谢谢.

Jam*_*rty 4

如果您只计划使用原始数据类型,那么您最初的基于宏的解决方案似乎就足够了。但是,当您开始存储指向具有复杂结构的不透明数据类型的指针对时,这些数据类型旨在通过在函数之间传递指针来使用,例如:

complex_structure_type *object = complex_structure_type_init();
complex_structure_type_set_title(object, "Whatever");
complex_structure_type_free(object);
Run Code Online (Sandbox Code Playgroud)

那么你必须

typedef complex_structure_type *complex_structure_type_ptr; 
Run Code Online (Sandbox Code Playgroud)

为了

DEFINE_PAIR(complex_structure_type_ptr);
Run Code Online (Sandbox Code Playgroud)

所以你可以

Pair_complex_structure_type_ptr p;
Run Code Online (Sandbox Code Playgroud)

进而

p.x = object;
Run Code Online (Sandbox Code Playgroud)

但这只是多了一点工作,所以如果你觉得它对你有用,那就去做吧。您甚至可以将自己的预处理器放在一起,该预处理器会遍历代码,提取诸如 Pair_whatever 之类的内容,然后为 C 预处理器添加 DEFINE_PAIR(whatever)。不管怎样,你在这里提出的绝对是一个好主意。

就我个人而言,我只会使用 void 指针,而忘记强类型安全。C 只是没有与其他语言相同类型的安全机制,并且您给自己忘记某些事情的机会越多,您意外创建的错误就越多。

祝你好运!