编译器警告(级别 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
};