void *以这样的方式定义它可以指向任何东西。那么它可以用于指向函数(int send())吗?
int send();
void* p = send;
有可能吗?当我这样使用时,它没有向我显示错误原因?如果没有,有没有办法将所有指针存储在一个变量中?
答案 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 *相同的表示和对齐要求。