コンパイラの警告 (レベル 3、オフ) C4191
'operation': 'type_of_expression' から 'type_required' への変換は安全ではありません
結果のポインターを使用してこの関数を呼び出した場合、プログラムがエラーになる可能性があります
関数ポインターを使用するいくつかの操作は安全でないと見なされます。
関数の種類の呼び出し規則が異なる場合。
関数の種類の復帰規則が異なる場合。
引数または戻り値の型のサイズ、型のカテゴリ、または分類が異なる場合。
長さが異なる引数リスト (
__cdecl
では、短い方の引数リストが varargs であっても、長い方のリストから短い方へキャストされる場合のみ)。データへのポインター (
void*
以外) が、関数へのポインターに対してエイリアスとして使用される場合。その他の型の違いによって、
reinterpret_cast
でエラーまたは警告が発生する場合。
結果として得られたポインターを使用して関数を呼び出すと、プログラムがクラッシュする可能性があります。
既定では、この警告はオフに設定されています。 詳細については、「 Compiler Warnings That Are Off by Default」を参照してください。
次の例では C4191 が生成されます。
// C4191.cpp
// compile with: /W3 /clr
#pragma warning(default: 4191)
void __clrcall f1() { }
void __cdecl f2() { }
typedef void (__clrcall * fnptr1)();
typedef void (__cdecl * fnptr2)();
int main() {
fnptr1 fp1 = static_cast<fnptr1>(&f1);
fnptr2 fp2 = (fnptr2) &f2;
fnptr1 fp3 = (fnptr1) &f2; // C4191
fnptr2 fp4 = (fnptr2) &f1; // C4191
};