我明白为什么你不能这样做:
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 *类型具有相同的长度。
那我有多难?
答案 0 :(得分:4)
你是对的,所有指针类型都是对象类型:
N1570 6.3.5类型,第20段,第五个清单项目:
- 指针类型可以从函数类型或对象类型派生,称为 引用类型。指针类型描述其值提供引用的对象 到引用类型的实体。从引用的类型T派生的指针类型 有时被称为“指向T”的指针。从一个指针类型的构造 引用类型称为“指针类型派生”。 指针类型是完整的 对象类型。
但指向对象类型的指针不一定与void*
(6.2.5 p28)具有相同的大小。
- 指向void的指针应具有与a相同的表示和对齐要求 指向字符类型的指针。 48)同样,指向合格或非限定版本的指针 兼容类型应具有相同的表示和对齐要求。所有 指向结构类型的指针应具有相同的表示和对齐要求 彼此相同。所有指向联合类型的指针都应具有相同的表示形式 对齐要求彼此。 指向其他类型的指针不必相同 表示或对齐要求。
醇>
但是,它们都可以转换到void*
(6.3.2.3 p1):
- 指向void的指针可以转换为指向任何对象类型的指针。指向的指针 任何对象类型都可以转换为指向void的指针,然后再返回;结果应该 比较等于原始指针。
醇>
答案 1 :(得分:-5)
此代码段错误。
void(*fp)(void) = &function; function_taking_void_pointer((void*)fp);
在C / C ++中,function name
将重新定位到linking stage
中的特定地址,因此您无法在&
之前使用function name
。另外function name
不是C / C ++中的变量,因此您也无法尝试获取其地址。