这是正确的代码吗?
class SomeClass;
SomeClass* createSomeClass(); // just returns new SomeClass
void* (*createFuncPtr)();
int main()
{
createFuncPtr= (void* (*)()) &createSomeClass;
SomeClass* instance = (SomeClass*)createFuncPtr();
}
C标准说:
768如果转换的指针用于调用类型为的函数 与指向类型不兼容,行为未定义。
在这种情况下,功能类型是否兼容?或者,如果我想避免麻烦,我是否被迫在调用之前重新强制转换函数指针?
SomeClass* instance = ((SomeClass* (*)())createFuncPtr)();
谢谢!
编辑:是的,它包含C ++代码,但如果它只是C,我的问题仍然有效,请保留C标记。
答案 0 :(得分:1)
从C99标准第6.7.5.1节第2段:
要使两个指针类型兼容,两者都应具有相同的限定条件,并且两者都应是兼容类型的指针。
在您的情况下,函数指针不兼容,因为返回值不兼容。所以,是的,你必须在调用指向函数之前强制转换。
答案 1 :(得分:-2)
您需要将其强制转换为正确的类型,否则很可能会损坏您的堆栈。请在此处查看更详细,更有趣的说明:Old New Thing: A function pointer cast is a bug waiting to happen
编辑:因为你需要将它转换为正确的类型你也可以只使用使用空指针(编辑:不起作用,因为空指针的尺寸可以更小,这要归功于Filipe)代替错误的函数指针来存储指针,以免意外调用它。或者使用正确的函数指针类型。或者是std :: function对象,具体取决于你的目标。