我正在编写一个函数,其中我有参数“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”中?
提前致谢。
答案 0 :(得分:5)
没有办法将类型传递给C函数,因为类型是编译时的概念。编译完成后,没有可讨论的类型:类型的知识被“编入”编译器生成的二进制代码,没有额外的元数据可供您的程序使用。
您可以自行传递大小,而不是传递类型,而不是传递类型。以qsort
或bsearch
函数为例:它们都在非类型化数组上工作,就好像它们知道确切的类型一样。让这些函数执行此操作的“魔法”在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 *
指针,但这需要您在稍后访问时检查类型。
如果你的问题更具体,我认为会更容易帮助你。