在C中传递一个类型作为参数

时间:2013-09-02 14:43:05

标签: c

我正在编写一个函数,其中我有参数“size”,并且根据size的值,我将使用unsigned char类型,unsigned short或unsigned int。 通常,我正在尝试做类似的事情:

if (size == 1) {unsigned char * memory = calloc(sizeOfFile,1);}
if (size == 2) {unsigned short * memory = calloc(sizeOfFile,1);}
if (size == 4) {unsigned int * memory = calloc(sizeOfFile,1);}

我可以在“if”之外使用“memory”。 有没有办法做到这一点,还是我必须将我的功能3次复制到每个“if”中?

提前致谢。

4 个答案:

答案 0 :(得分:5)

没有办法将类型传递给C函数,因为类型是编译时的概念。编译完成后,没有可讨论的类型:类型的知识被“编入”编译器生成的二进制代码,没有额外的元数据可供您的程序使用。

您可以自行传递大小,而不是传递类型,而不是传递类型。以qsortbsearch函数为例:它们都在非类型化数组上工作,就好像它们知道确切的类型一样。让这些函数执行此操作的“魔法”在size_t nel参数中,以及一个带有const void *参数的函数指针。

您可以使用相同的方式为API建模。您已经将size作为参数,所以剩下的就是指针数学。将指针转换为char *,以便添加size将指针推进到“type”的下一个元素,执行算术以将指针前进到目标,然后将指针转换回{ {1}}。

答案 1 :(得分:2)

如果它是一个相对较小的函数,你可以写一个宏:

#define FOO(T, x, y, z) do \
{ \
    T * memory = calloc(sizeOfFile, 1); \
    ... \
    ... \
    ... \
} while(0)
然后你会称之为

,例如

FOO(char, x, y, z);

FOO(int, x, y, z);

它很丑陋,关于宏的常见警告适用,但在某些情况下它可能是一个合理的解决方案。

答案 2 :(得分:1)

通常,您只需使用void *指针,并在单独的变量中跟踪类型。

答案 3 :(得分:0)

这取决于你想做什么。

您的分配全部分配sizeofFile个字节,这可能不是您想要做的。

您可以使用void *指针,但这需要您在稍后访问时检查类型。

如果你的问题更具体,我认为会更容易帮助你。