コンパイラの警告 (レベル 3) C4191
更新 : 2007 年 11 月
エラー メッセージ
'operator/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
};