Share via


コンパイラの警告 (レベル 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
};