我有一个像这样的原型的函数:
ErrorType function(void ** parameter, other_args);
此函数读取'参数'指向的指针并对其进行更改(将其视为realloc)。
现在,根据C标准,如果我想传递其他指针的地址而不是void *,我必须声明一个临时的void *变量并使用它。
所以我想创建一个包装器(我不在乎它是一个函数还是一个宏),用任何指针类型进行函数调用。
我想我可以在C11中使用_Generic和每个基本类型的函数,以及所有结构的函数和所有联合的函数,但我认为这太麻烦了。
我还读到了一个GCC扩展,它允许你在表达式中编写语句和声明,我认为我可以很容易地做到我想要的那样,但我更喜欢我的代码在所有标准编译器中编译,而不仅仅是GCC或Clang。
所以问题是,在C11编译器中没有太多问题,有没有办法做到这一点?
答案 0 :(得分:0)
如果我正确理解了这个问题,您希望function
能够修改各种类型的指针。好吧,有关于此的坏消息和好消息。
坏消息:指针的对象表示是不透明的,因此您需要与function
通信它应该使用哪种指针,除非您的函数保证复制对象表示来自源指针的对象表示,你知道这两个表示具有相同的含义。
例如,sizeof (double *)
可能与sizeof (void *)
好消息:指向任何对象类型的指针可以转换为void *
并再次转发,其中包括void **
和double **
任何其他指针类型。所以你可以:
ErrorType function(void * ptr, int ptr_type, ...) {
void ** vpp;
double ** dpp;
...
...
switch (ptr_type) {
case PTR_TYPE_VOIDP:
vpp = ptr;
/* Now you can work with *vpp */
*vpp = ...
break;
case PTR_TYPE_DOUBLEP:
dpp = ptr;
/* Now you can work with *dpp */
*dpp = ...
break;
}
...
}