7

我正在尝试编写一些通用结构。从本质上讲,我需要的是 C++ 模板,但由于我是用 C 编写的,所以模板不在考虑之列。目前我正在考虑两种方法来实现我想要的。

方法一:使用预处理器。像这样:

#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 中编写通用结构?

谢谢。

4

3 回答 3

4

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

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(whatever)。无论如何,您在这里提出的想法绝对是一个好主意。

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

祝你好运!

于 2011-08-15T19:20:10.940 回答
2

注意到 c++ 中的模板提供了一种用于编写代码的语言,您可以简单地考虑使用比 c 预处理器更强大的工具进行代码生成。

现在,这确实为您的构建增加了另一个步骤,并使您的构建依赖于另一个代价(除非您愿意用 c 编写自己的生成器......),但它可能会提供您想要的灵活性和类型安全性。

于 2011-08-15T20:27:26.297 回答
1

这几乎相同,但更灵活一点:

#define PAIR_T(TYPE) \
    struct { \
        TYPE x; \
        TYPE y; \
    }


typedef PAIR_T(int) int_pair;
typedef PAIR_T(const char *) string_pair;

int main(void)
{
    int_pair p = {1, 1};
    string_pair sp = {"a", "b"};
}
于 2014-05-20T05:34:17.267 回答