can void *用于存储函数指针?

时间:2014-11-13 19:50:38

标签: c++ c function-pointers void-pointers

void *以这样的方式定义它可以指向任何东西。那么它可以用于指向函数(int send())吗?

int send();
void* p = send;

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

2 个答案:

答案 0 :(得分:16)

也许。在C ++ 11之前,他们无法做到。但C ++ 11补充道:

  

将函数指针转换为对象指针类型,反之亦然   有条件地支持。这种转换的意义是   实现定义,但实现支持   双向转换,将一种类型的prvalue转换为   其他类型和背部,可能具有不同的资格认定,应   产生原始指针值。

这似乎还没有进入C版。

当然,你之间无法进行转换的原因是因为 它们的大小或格式可能不同。 Posix要求他们这样做 具有相同的大小和格式,我希望所有Posix编译器 支持转换;无论如何,大多数人都做过,即使这样做了 不符合的。

编辑:

更多信息。在重新阅读C标准之后,我想 对象指针和函数指针之间的转换是未定义的 行为:C标准似乎不需要诊断 case,但它肯定没有为它定义任何行为。如 未定义的行为,实现(或Posix)可以自由定义它。 或者只是做任何想做的事情而不记录它。

另一方面,C ++,预C ++ 11,需要诊断(尽管如此) 许多编译器都没有给出一个)。在C ++ 11中,按照段落 如上所述,它是实现定义是否实现 支持与否,如果实现支持它,它们是 需要记录其行为。所以在所有情况下,一个实现 需要记录它的作用,如果它不支持它,它 如果代码尝试执行此操作,则需要发出诊断信息 转换。

答案 1 :(得分:15)

不,不可能。

根据C标准(6.3.2.3指针)

  

1指向void的指针可以转换为指向any的指针   对象类型。指向任何对象类型的指针可以转换为指向void的指针,然后再返回;结果应该等于   原始指针。

至于函数指针那么

  

8指向一种类型的函数的指针可以转换为指向的指针   另一种类型的功能又回来了;结果应该比较   等于原始指针。如果转换的指针用于调用   一个类型与引用类型不兼容的函数,   行为未定义。

在C ++标准中,有更详细的指针定义(3.9.2化合物类型)

  

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

  

4 可以使用指向cv-qualified(3.9.3)或cv-unqualified void 的指针   指向未知类型的 bjects 。这样的指针应该能够   保持任何对象指针。 cv void *类型的对象应具有   与cv char *相同的表示和对齐要求。