今天我了解到函数指针和数据指针不相同,因此彼此不兼容(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
感谢您的帮助!
答案 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
。