C++ void*可以用来存储函数指针吗?

C++ void*可以用来存储函数指针吗?,c++,c,function-pointers,void-pointers,C++,C,Function Pointers,Void Pointers,void*的定义可以指向任何东西。那么它可以用来指向函数(int send())吗 可能吗?当我这样使用时,它不会向我显示错误,为什么?如果没有,是否有办法将所有指针存储在一个变量中?否可能没有 根据C标准(6.3.2.3指针) 1指向void的指针可以转换为指向任意 对象类型。指向任何对象类型的指针可以转换为指向void和back的指针;结果应等于 原始指针 那么函数指针呢 8指向一种类型函数的指针可以转换为指向 另一种类型的函数,然后再返回;结果应进行比较 等于原始指针。如果使用转换的指针调

void*的定义可以指向任何东西。那么它可以用来指向函数(int send())吗

可能吗?当我这样使用时,它不会向我显示错误,为什么?如果没有,是否有办法将所有指针存储在一个变量中?

否可能没有

根据C标准(6.3.2.3指针)

1指向void的指针可以转换为指向任意 对象类型。指向任何对象类型的指针可以转换为指向void和back的指针;结果应等于 原始指针

那么函数指针呢

8指向一种类型函数的指针可以转换为指向 另一种类型的函数,然后再返回;结果应进行比较 等于原始指针。如果使用转换的指针调用 其类型与引用类型不兼容的函数 行为是未定义的

<>在C++标准中,指针的详细定义(3.92-复合类型)

3指向void的指针或指向对象类型的指针的类型为 称为对象指针类型…可以 指定一个称为函数指针类型的函数

4可以使用指向cv合格(3.9.3)或cv不合格无效的指针 指向未知类型的对象。此类指针应能够 按住任何对象指针。cv void*类型的对象应具有 与cv char*相同的表示和对齐要求


也许吧。在C++11之前,他们不能;但是C++11增加了:

将函数指针转换为对象指针类型或将函数指针转换为对象指针类型是非常困难的 有条件地支持。这种转换的意义是 定义了实现,除非实现支持 双向转换,将一种类型的prvalue转换为 其他类型和背面,可能具有不同的CVD认证,应 生成原始指针值

这似乎还没有变成C

当然,你不能在它们之间转换的原因是 它们可能没有相同的大小或格式。Posix要求他们这样做 具有相同的大小和格式,我希望所有Posix编译器 支持转换;不管怎么说,大多数人以前都是这样做的,尽管这让他们 不一致

编辑:

再多了解一点。在重新阅读了C标准之后,我认为 对象指针和函数指针之间的转换未定义 行为:C标准似乎不需要在这方面进行诊断 案例,但它肯定没有定义它的任何行为。作为 未定义的行为,实现(或Posix)可以自由定义它。 或者只是做它想做的任何事情,而不记录它

另一方面,C++、Pr+C++ 11需要一个诊断(尽管 许多编译器没有给出答案)。在C++11中,根据 如上所述,它是由实现定义的 支持与否,如果实现支持它,它们是 需要记录其行为。因此,在所有情况下,实现 需要记录其功能,如果不支持,则 如果代码试图执行以下操作,则需要发出诊断
转换。

否,void*与函数指针不兼容我认为可以将
void*
定义为能够保存任何数据指针。函数指针(和C++成员指针)是完全不同的动物。虽然POSIX允许将函数指针指定给
void*
(它甚至在C标准
J.5.7函数指针强制转换中作为一个常见扩展列出)。但在任何特定的实现中(比如在大多数编译器都可以的x86上),这并不意味着该标准允许它(我相信它不允许)@dmckee事实上,在x86上我遇到的问题最多。想想以前的远/近问题,以及编译模型,其中函数指针远,但数据指针近,反之亦然。函数不是对象类型(尽管可以将其转换为lambda),引用的段落当然只适用于C。C++中的规则是不同的,但是POSIX确实需要转换,并且它们具有相同的大小和表示,作为代码的需求的一部分。它只是没有说“可能”。@newacct谢谢。我现在知道“不可以”和“不可以”是不同的。这是最接近正确答案的,被接受的答案是错误的。对于标准C,它是未定义的;对于POSIX C,它是尽可能地定义的;对于C++11,它的定义如上所述。GCC对此绝对支持。@sjdowling:我看不到对被接受答案的反对票。如果你认为这是错误的,为什么不投反对票呢?@sjdowling就ISO标准而言,被接受的答案对于C是正确的。(Posix在几个地方与C语言的ISO标准相矛盾。)
int send();
void* p = send;