在标准C中是否有一个建议的整数类型来存储函数指针

在标准C中是否有一个建议的整数类型来存储函数指针,c,c99,c11,C,C99,C11,C99标准具有uintptr\u t,这是一种建议将数据指针(指向对象的指针)转换为的整数类型,但我没有找到用于存储函数指针的等效整数类型。我忽略了吗 特定的编译器可以定义这样的类型,即使它不在标准中,但编译器更可能声明函数指针可以存储在(比如)一个uint64\t中,而不是定义一个新类型 另一个区别是,在数据指针上执行整数运算的方式和在函数指针上不执行整数运算的方式是有意义的。一个常见的习惯用法是(int*)((uintpttr_t)p+15)和(uintpttr_t)15,但没有理由将此习惯

C99标准具有
uintptr\u t
,这是一种建议将数据指针(指向对象的指针)转换为的整数类型,但我没有找到用于存储函数指针的等效整数类型。我忽略了吗

特定的编译器可以定义这样的类型,即使它不在标准中,但编译器更可能声明函数指针可以存储在(比如)一个
uint64\t
中,而不是定义一个新类型


另一个区别是,在数据指针上执行整数运算的方式和在函数指针上不执行整数运算的方式是有意义的。一个常见的习惯用法是
(int*)((uintpttr_t)p+15)和(uintpttr_t)15
,但没有理由将此习惯用法应用于函数指针。

没有推荐的指针类型

要存储指针,可以使用任何其他函数指针类型,只要不通过它调用函数

如果将指针转换为原始类型,则可以调用函数。这始终保证有效

我没有找到用于存储函数指针的等效整数类型


这是因为不能将函数指针转换为整数。这样做会导致未定义的行为。

函数指针没有这样的整数类型可转换


原因之一是:在某些机器上,函数地址可能非常大,比任何数据指针都大。

我认为所有函数指针类型的大小都相同,因此可以使用类似于
void(*)(
的内容作为占位符…”没有理由将此习惯用法应用于函数指针这可能就是标准中缺少这种指针的原因:很容易找到将数据指针转换为整数的原因;对于函数指针来说,这并不容易-我想不出有什么操作需要以任何方式更改函数指针。@dasblinkenlight为什么这可能有用。谢谢您的确认。这是对一篇博文草稿的最后一点事实检查。你“赢得”了提前看到它的权利,并告诉我所有我得到的函数指针类型语法错误的地方:(password:pointer)@PascalCuoq,我不是一个编译器(我想大多数观众都不在这里),所以我不是一个可靠的C语法校对员,相反。但除此之外,你的帖子看起来还不错:)再次感谢,我已经发布了这篇有问题的帖子。我不会说标准规定将函数指针转换为整数会产生未定义的行为。请参阅整个C99 6.3.2.3:6,它以“任何指针类型都可以转换为整数类型”开头。该标准当然不能保证您可以利用这种转换的结果做任何有用的事情。@PascalCuoq可能是1。它只是指对象指针,2。或者我一直坚持使用C89标准,但我确信我最近(在其他人的帮助下)推断出它是UB。@PascalCuoq啊,我找到了!是你,不仅仅是一个谐音,对吗?是什么让你删除了这个问题?@PascalCuoq-Yap,是我。显然,这个问题被认为不是很有趣或有用,我得到的唯一答案是不正确的,也没有完全回答我的问题;此外,我不想让另一个牺牲性的问题暴露在愤怒的选民面前。