我正在尝试编写一些通用结构.基本上,我需要的是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中编写通用结构?
谢谢.
如果您只计划使用原始数据类型,那么您最初的基于宏的解决方案似乎就足够了。但是,当您开始存储指向具有复杂结构的不透明数据类型的指针对时,这些数据类型旨在通过在函数之间传递指针来使用,例如:
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 只是没有与其他语言相同类型的安全机制,并且您给自己忘记某些事情的机会越多,您意外创建的错误就越多。
祝你好运!