2

假设我有一个功能

void myFun(int*) 
在 C++ 中,以下究竟是什么意思


  ( void(*)(void*) )&myFun

它是指向以 a(void*)作为参数并返回 a的函数的指针void吗?允许这种类型的演员表吗?

4

2 回答 2

6

就目前而言,我很确定这是不允许的。

如果您删除首字母周围的括号void以获得:

void (*)(void *)

...那么是的,它是一个指向返回 void 并将指向 void 的指针作为其唯一参数的函数的指针。要转换为该类型,您需要将类型的整个名称括在括号中,这样您将获得: (void (*)(void *)),您将在其后跟被转换的值,以获得:

(void (*)(void *))&myFun;

至少如果内存服务,是的,这是允许的,尽管通过结果取消引用指针(即尝试调用它指向的函数)可能会产生未定义的行为。特别是,当/如果您调用该函数时,它需要一个指向 int 的指针,并且(可能)将使用它指向的任何内容作为 int。但是,如果它指向的内容没有正确对齐以用作 int,则它不太可能按预期工作。

于 2012-06-28T05:49:54.233 回答
3

演员是允许的,由 5.2.10 (6):

函数指针可以显式转换为不同类型的函数指针。通过指向与函数定义中使用的类型不同的函数类型(8.3.5)的指针调用函数的效果是未定义的。除了将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是函数类型)并返回其原始类型会产生原始指针值之外,这种指针转换的结果是未指定的.

这相当于 C 6.3.2.3 (8):

指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,然后再返回;结果应与原始指针比较。如果转换后的指针用于调用其类型与指向的类型不兼容的函数,则行为未定义。

在实践中,通过具有不同但兼容的参数类型(尤其是指针类型)的函数指针调用通常会成功,并且具有对参数进行 C 样式强制转换的效果。但是,这绝不是保证;https://stackoverflow.com/a/189126/567292讨论了 gcc 决定进行此类未定义函数指针强制转换调用的情况abort

于 2012-06-28T07:58:56.107 回答