具有不同返回类型的函数指针

这是正确的代码吗?

class SomeClass; SomeClass* createSomeClass(); // just returns new SomeClass void* (*createFuncPtr)(); int main() { createFuncPtr= (void* (*)()) &createSomeClass; SomeClass* instance = (SomeClass*)createFuncPtr(); } 

C标准说:

768如果转换的指针用于调用类型与指向类型不兼容的函数,则行为未定义。

在这种情况下,function类型是否兼容? 或者,如果我想避免ant的麻烦,我是否被迫在调用之前重新强制转换函数指针?

 SomeClass* instance = ((SomeClass* (*)())createFuncPtr)(); 

谢谢!

编辑:是的,它包含C ++代码,但如果它只是C,我的问题仍然有效,请保留C标记。

从C99标准第6.7.5.1节第2段:

要使两个指针类型兼容,两者都应具有相同的限定条件,并且两者都应是兼容类型的指针。

在您的情况下,函数指针不兼容,因为返回值不兼容。 所以,是的,你必须在调用指向函数之前强制转换。

您需要将其强制转换为正确的类型,否则很可能会损坏您的堆栈。 在这里查看更详细和有趣的描述: Old New Thing:一个函数指针转换是一个等待发生的bug

编辑:因为你需要将它强制转换为正确的类型你也可以只使用一个void指针 (编辑:不起作用,因为void指针可能有一个较小的尺寸,感谢Filipe)而不是错误的函数指针存储指针,以避免意外调用它错误。 或者使用正确的函数指针类型。 或者是std :: function对象,具体取决于你的目标。