我了解您为何无法做到:
void(*fp)(void) = &function;
function_taking_void_pointer((void*)fp);
因为类型的长度可能不同。
但是添加另一个间接层有什么问题:
void(*fp)(void) = &function;
void(**fpp)(void) = &fp;
function_taking_void_pointer((void*)fpp)
我对此的背后思考:指向函数指针的指针应指向数据存储器,因此应与void *类型具有相同的长度。
那我怎么了?
没错,所有指针类型都是对象类型:
N1570 6.3.5类型,第20段,第五个清单项目:
- 指针类型可以从称为引用类型的函数类型或对象类型派生。指针类型描述了一个对象,该对象的值提供对所引用类型的实体的引用。从引用类型T派生的指针类型有时被称为“ T指针”。从引用类型构造指针类型的过程称为“指针类型派生”。指针类型是完整的对象类型。
但是,指向对象类型的指针的大小不必等于void*
(6.2.5 p28)。
- 指向void的指针应具有与字符类型的指针相同的表示和对齐要求。48)同样,指向兼容类型的合格或不合格版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针应具有相同的表示和对齐要求。指向联合类型的所有指针应具有相同的表示和对齐要求。指向其他类型的指针不必具有相同的表示或对齐要求。
但是,它们都可以转换为void*
(6.3.2.3 p1):
- 指向void的指针可以与任何对象类型的指针进行转换。指向任何对象类型的指针都可以转换为void指针并再次返回;结果应等于原始指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句