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

时间:2014-04-01 09:46:04

标签: c++ c

这是正确的代码吗?

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标记。

2 个答案:

答案 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对象,具体取决于你的目标。