【发布时间】:2018-11-23 19:05:59
【问题描述】:
我有一个返回 void 指针 (void*) 的后端函数,并且我有几个指向它的前端函数指针。然而,每个前端函数指针都需要返回不同的类型(尽管总是一个指针)。因为每个前端函数指针总是具有相同的唯一返回类型,所以我认为可以将每个前端指针的返回类型强制转换为各自的返回类型。
希望我下面的代码能比我解释得更好:
//Backend function definition
void* addElement(void *memBlock, size_t origSize, size_t additionalSize){
return realloc(memBlock, origSize+additionalSize);
}
//Front end function pointers
int*(*addInt)(void*, size_t, size_t)=addElement;
char*(*addChar)(void, size_t, size_t) addChar=addElement;
我的问题有两个:
-
这与每次调用函数时只对返回值进行类型转换有什么不同,如下所示?
int *var=(int *)addElement(...); 如果不同,它会起作用吗?阅读this discussion 和this one 后,似乎归结为兼容性问题。由于原始函数返回 void* ,如果我没记错的话它应该是兼容的。
【问题讨论】:
-
在实践中这很有可能奏效。但是不保证能正常工作。
-
(int*(*)(void*, size_t, size_t)) addInt=(int*(*)(void*, size_t, size_t))addElement;-- 你在这里尝试什么?强制转换返回r-value并且您不能分配给 r 值。这甚至可以编译吗? -
@AjayBrahmakshatriya:我认为 OP 正试图将
addInt声明为指向函数的指针,该函数返回指向int的指针。如您所知,正确的语法是int *(*addInt)(void *, size_t, size_t) = …。 RHS 看起来在语法上是正确的——我没有通过编译器运行它。 -
@JonathanLeffler RHS 在我看来也不错。 OP 实际上在左侧的类型周围有括号。所以我认为他是在铸造然后分配。但正如你所说,它一定是一个语法错误的声明。
-
@AjayBrahmakshatriya 修复了语法。你假设它是一个语法错误的声明是正确的。感谢您的帮助。
标签: c casting function-pointers