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