2

我正在编写一个函数,其中有参数“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);}

我可以在“如果”之外使用“记忆”。有什么方法可以做到这一点,还是我必须将我的函数复制 3 次到每个 "if" 中?

提前致谢。

4

4 回答 4

5

无法将类型传递给 C 函数,因为类型是编译时概念。一旦编译器完成,就没有类型可谈了:类型的知识被“烘焙”到编译器生成的二进制代码中,没有额外的元数据可供您的程序使用。

您可以传递一个大小,而不是传递一个类型,然后自己进行指针数学运算。以qsortorbsearch函数为例:它们都在无类型数组上工作,就好像它们知道确切的类型一样。让这些函数做到这一点的“魔法”在size_t nel参数中,以及一个带参数的函数指针const void *

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

于 2013-09-02T14:55:32.563 回答
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);

这很丑陋,而且通常需要注意宏,但在某些情况下,它可能是一个合理的解决方案。

于 2013-09-02T14:51:12.267 回答
1

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

于 2013-09-02T14:46:11.947 回答
0

这取决于你想做什么。

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

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

我认为,如果您的问题更具体,那么为您提供帮助会更容易。

于 2013-09-02T14:46:01.577 回答