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));
}

これは、少なくとも 1 つのコンパイラでコンパイル、実行、および出力されます :) これは、維持するはずのレガシー コードで見つかりました。これは安全/定義されているのでしょうか?bar : 12

barは type と一致しないfptrため、これを機能させる唯一の方法は、安全でないキャストを使用することです。エリプシスマジックが内部でどのように機能するかに依存すると思いますが、それは何らかの方法で定義されていますか?

4

1 に答える 1

10

コードが行っていることは、未定義の動作です。その動作が偶然である場合、動作するという保証はありません。キャストされた関数ポインターで安全に実行できる唯一のことは、元の型にキャストすることです。

于 2011-10-18T13:53:15.790 に答える