是否有可能在C中实现temeplatization,因为它可能在C++中

是否有可能在C中实现temeplatization,因为它可能在C++中

问题描述:

我想在C中编写一个函数,它将接受任何类型的数据类型,如int,char,float或任何其他数据类型,并对他们。因为这在C++中是可行的,在C中可能吗?是否有可能在C中实现temeplatization,因为它可能在C++中

+0

无效的数据类型Ç多数民众赞成的限制*?..... ............. –

您可以创建并接受union,也可以使用通用的void*指向数据。但是C不支持C++中的模板。

+1

我有一个疑问,要使用调用函数内部的值,我们必须知道从调用函数传递的值的数据类型,因为我们不能使用void指针而不用将其转换为正确的数据类型。所以这不是完整的模板。如果有什么不对,请原谅我。 – Prak

关于你可以在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

这不会很漂亮。以this page为例。大量的宏观使用。

+0

+1尼斯链接。 :) – Mysticial

+0

你说,如果C++模板是“漂亮”。 ;-) –

+0

@Paul R,他们......更漂亮。 ;) – Zeenobit

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

您可以使用...varargs功能

我猜它必须是一个空指针

void *p; 

只是强制转换和使用它。你问就是为什么在C++

介绍阅读您的评论我想在您需要的参数发送可变

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

谢谢...是的,使用一个数据类型的字段,我们可以在C中实现一些模板化。 – Prak

+0

但是我想它一定是相当长的代码,如果它的条件和类型化它:) – niko

+0

@niko:你可以尝试按照函数需要void指针和大小,比如'memcpy'等。我怀疑'qsort'这样的函数是通用的。 – visitor