8

考虑以下程序:

#include <iostream>

typedef void (*fptr)(...);

void foo(fptr func) {
    (*func)(12);
}

void bar(int x) {
    std::cout << "bar : " << x << std::endl;
}

int main() {
    foo(fptr(bar));
}

这可以在至少一个编译器上编译、运行和打印bar : 12:) 我在一些我应该维护的遗留代码中发现了这一点,我想知道这是否安全/已定义?

bar与 type 不匹配fptr,因此使其工作的唯一方法是使用不安全的强制转换。我想这取决于省略号魔法在内部是如何工作的,那么它是以某种方式定义的吗?

4

1 回答 1

10

代码所做的是未定义的行为。如果它的工作是偶然的,则不能保证它应该工作。使用转换函数指针唯一可以安全地完成的事情是将其转换回其原始类型。

于 2011-10-18T13:53:15.790 回答