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

我正在尝试编写一些通用结构.基本上,我需要的是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;
}

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

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

typedef struct Pair{
   void* x;
   void* y;
} Pair;

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

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

谢谢.

解决方法

如果您只打算使用原始数据类型,那么您原来的基于宏的解决方案似乎非常有用.但是,当您开始将指针对存储在下面具有复杂结构的不透明数据类型时,通过在函数之间传递指针来使用它们,例如:
complex_structure_type *object = complex_structure_type_init();
complex_structure_type_set_title(object,"Whatever");
complex_structure_type_free(object);

那么你必须

typedef complex_structure_type *complex_structure_type_ptr;

为了

DEFINE_PAIR(complex_structure_type_ptr);

所以你可以

Pair_complex_structure_type_ptr p;

然后

p.x = object;

但这只是一点点工作,所以如果你觉得它适合你,那就去吧.您甚至可以将自己的预处理器放在一起,通过代码,拉出任何类似Pair_whatever的东西,然后为C预处理器添加DEFINE_PAIR(无论如何).无论如何,这绝对是你在这里展示的一个巧妙的想法.

就个人而言,我只会使用无效指针而忘记强类型安全性. C只是没有与其他语言相同的类型安全机制,你忘记某些东西的机会越多,你就会意外地创造出越多的错误.

祝好运!

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...