是否有可能在C语言中实现C语言中的模板化

时间:2011-09-29 05:54:12

标签: c++ c

我想在C中编写一个函数,它接受任何类型的数据类型,如int,char,float或任何其他数据类型,并对它们执行一些操作。因为在C ++中这是可能的,在C?

中是否可行

6 个答案:

答案 0 :(得分:9)

它不会很漂亮。看一下this page的例子。很多宏用法。

答案 1 :(得分:1)

关于你在C中唯一能做的就是宏,模板的表兄弟。例如:

#define max(a, b) ((a) < (b) ? (b) : (a))

请注意,这有一个很大的问题......宏参数被多次评估。例如:

max(i+=1, i);

扩展为:

((i+=1) < (i) ? (i+=1) : (i));

表达式的结果可能是各种编译器上的各种有趣的东西。

因此,宏实际上是模板的不良替代品。您可以使用与它们类型无关的“功能”。但它们带来了许多障碍和陷阱,这使得它们对于任何非常重要的东西几乎毫无用处。它们也相当“毛茸茸”,使你的代码比模板更难理解。

我刚给出的max示例可能看起来不那么毛茸茸(虽然对参数的双重评估肯定是令人惊讶且难以处理的事情),但是here is an example of declaring something like a templated vector type with macros, and it is obviously hairy

答案 2 :(得分:0)

您可以创建并接受union,也可以使用通用void*获取指向数据的指针。但是,C不像C ++那样支持模板化。

答案 3 :(得分:0)

是的,可以通过使用宏来实现。看到 http://www.flipcode.com/archives/Faking_Templates_In_C.shtml

答案 4 :(得分:0)

您可以使用...安排作弊,例如:使用varargs函数

答案 5 :(得分:0)

我猜它一定是一个无效指针

  void *p;

只是进行类型转换并使用它。你问的是c的限制,这就是它在c ++中引入的原因

在阅读你的评论后,我猜你需要一个参数来发送变量的数据类型

 func( void *p, int ) \\ second argument must be a datatype use sizeof to find the datatype