不同的函数指针是否相互兼容?

时间:2013-11-26 07:56:52

标签: c++ pointers function-pointers

今天我了解到函数指针和数据指针不相同,因此彼此不兼容(Why are function pointers and data pointers incompatible in C/C++?)。我的问题是,不同的函数(非成员)指针是否相互兼容(以相同的方式实现)。

在代码中:

typedef void(*FuncPtr0)();
typedef void(*FuncPtr1)(int);

FuncPtr0 p0;
FuncPtr1 p1;

p0 = reinterpret_cast<FuncPtr0>(p1);    // will this always work, if p1 really 
p0();                                   // points to a function of type FuncPtr0

感谢您的帮助!

2 个答案:

答案 0 :(得分:9)

n3376 5.2.10 / 6

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

答案 1 :(得分:1)

不,它们不兼容,并将调用未定义的行为。您将得到未指定的结果。

实际上你可以将它们相互转换,但你不应该调用一个指向不兼容的函数签名的函数指针。 例如,请参阅this code

typedef void(*FuncPtr0)();

void p1f()      { std::cout << "ONE";        }
void p2f(int x) { std::cout << "TWO " << x ; }

int main()
{
    FuncPtr0 p0 = reinterpret_cast<FuncPtr0>(p2f);
    p0();
} 

输出

TWO 1

问题是谁将参数x设置为1?它可能会运行但结果未指定。在我的系统中,结果是其他东西(垃圾)TWO 39