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

C++ 具有不同返回类型的函数指针,c++,c,C++,C,这是正确的代码吗 class SomeClass; SomeClass* createSomeClass(); // just returns new SomeClass void* (*createFuncPtr)(); int main() { createFuncPtr= (void* (*)()) &createSomeClass; SomeClass* instance = (SomeClass*)createFuncPtr(); } C标准规定: 768

这是正确的代码吗

class SomeClass;

SomeClass* createSomeClass(); // just returns new SomeClass
void* (*createFuncPtr)();

int main()
{
    createFuncPtr= (void* (*)()) &createSomeClass;
    SomeClass* instance = (SomeClass*)createFuncPtr();
}
C标准规定:

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

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

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


<>编辑:是的,它包含C++代码,但是如果C是C,我的问题仍然有效,请留下C标签。

你需要将它重新返回正确的类型,否则你很可能会损坏你的栈。请参见此处更详细、更有趣的描述:


编辑:由于您需要将其强制转换为正确的类型,您也可以使用一个空指针(编辑:不起作用,因为空指针的大小可能更小,多亏了Filipe),而不是使用错误的函数指针来存储指针,以避免意外地调用错误的指针。或者使用正确的函数指针类型。或std::function对象,具体取决于您的目标。

来自C99标准第6.7.5.1节第2段:

对于要兼容的两种指针类型,两者都应具有相同的资格,并且都应是指向兼容类型的指针


在您的情况下,函数指针不兼容,因为返回值不兼容。因此,是的,在调用pointed-to函数之前,您必须回溯。

您想实现什么?只是想得到这个特定问题的答案;)@菲利佩:它在哪里说的,为什么不起作用?具有不同大小的函数指针和无效指针的疯狂平台?@nwp是的,这是一个很好的例子。该标准不保证void指针和函数指针大小相同。它也不能保证您可以互换使用它们。即使它们大小相同,由于防止数据执行,您也不应该混合使用数据指针和代码指针。@Filipe我不理解您评论中的防止数据执行部分。根据我的理解,指针在哪里并不重要,它只关系到指针指向的位置,因此在堆栈上放置一个指向常规函数的函数指针必须始终有效。所以我看不到void指针和函数指针在防止数据执行方面的区别。我错过了什么吗?@nwp当然,指针存储在哪里并不重要——我对DEP的评论是强调混合数据和代码是多么糟糕的想法,因为它可能会导致神秘的错误。可能是空指针和函数指针确实大小相同,并且定义了两者之间的转换(就像POSIX中的情况一样),但就C标准而言,这是无法假设的。关于这一点,这里有很多问题,比如说,谢谢菲利佩,这是有道理的。那么,什么是两种兼容的类型呢?你有没有一个兼容类型的例子,这个函数指针转换可以工作?@jeremylaum底线是
void
someClass
是不兼容的类型,因为它们是不同的类型。类型兼容性的规则相当长,但您可以查看C99中的第6.2.7节。