指向函数的指针的uintptr_t/intptr_t对应是什么?

8
据我所知,uintptr_tintptr_t可以用于保存任何指向void的指针。因此,这些类型可以用于存储指向数据的指针。
在C99或更高版本中,是否有类似的有符号和无符号整数类型能够保存指向函数的指针?

没有单一的“指向函数”的类型(每个类型取决于函数原型)。 - barak manos
你甚至不能将一个函数指针转换为 void *。而且 C 和 C++ 是不同的编程语言。请将你的问题限制在其中一个语言上。 - too honest for this site
@barakmanos 是的,但每个函数指针类型在转换后都可以存储任何其他函数指针类型,因此如果您有一个足够大的整数类型用于一个函数指针类型,那么您应该有一个足够大的整数类型用于所有函数指针类型。 - user743382
1
@Olaf 你可以将它转换为足够大的整数类型。只是没有保证任何整数类型都足够大。 - user743382
@hvd:是的,我自己找到了。我确信他们也在那里使用了“对象指针”这个术语。对于造成的混淆,我很抱歉。我已经删除了我的评论。 - too honest for this site
1个回答

13

不,没有这样的类型。

函数指针只能可靠地转换为其他函数指针类型(并且仅在指向正确的函数类型时才能解引用)。

在C语言中,将函数指针转换为整数的方法由6.3.2.3/6进行说明:

  

任何指针类型都可以转换为整数类型。除了先前指定的情况外,结果是实现定义的。如果结果无法在整数类型中表示,则行为未定义。结果不一定在任何整数类型的值范围内。

请注意,即使整数类型足够大,将其强制转换为整数,再转换回函数指针也不能保证检索到原始函数指针。

在C ++中,有关文本位于[expr.reinterpret.cast]点4和6。 行为类似,但它明确保证如果存在足够大小的整数,则将函数指针转换为整数并再次转换会检索到原始函数指针。


1
只是要补充一点,实现必须指定_实现定义_行为。因此,应该能够找到特定实现是否有效以及如何进行这样的转换。这可以通过ABI完成,不一定在编译器中。void *和函数指针之间可能存在类似的转换(参见J.5.7)。 - too honest for this site
只是为了告知其他读者:C标准中的J.5是关于C语言常见扩展的章节,位于关于可移植性问题的信息性(非规范性)附录J中。 - jotik
你可以使转换更加可靠:_Static_assert(sizeof(uintptr_t) >= sizeof(func_pointer_t), "bleh");。这样,这种转换只会在指针是与地址不同的其他系统上失败(在我看来,这些系统无论如何都值得崩溃)。 - Lundin
2
@Lundin:仅仅因为函数指针和其他指针的大小不同,并不意味着指针是“与地址不同的东西”。并非每台机器都是冯·诺伊曼体系结构(事实上,由于嵌入式CPU远远超过桌面CPU 而且 x86技术上不是冯·诺伊曼体系结构[它是混合体系结构],我认为大多数系统都不是冯·诺伊曼体系结构)。在嵌入式系统中,函数指针通常比其他指针更大(也就是说,在C语言中,它们通常会被填充到相同的类型,但并不总是这样)。 - Tim Čas
@TimČas 标准甚至明确指出地址就是指针。(C11 6.5.3.2/3)。我猜“指针不是地址”的人实际上是指“指针不是整数”,这在某种程度上是具有讽刺意味的。 - M.M
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接