编译器警告(等级 3)C4191

更新:2007 年 11 月

错误消息

“operator/operation”: 从“type of expression”到“type required”的转换不安全

若干涉及函数指针的运算被认为是不安全的:

  • 具有不同调用约定的函数类型。

  • 具有不同返回约定的函数类型。

  • 具有不同大小、不同类型类别或不同类别的参数或返回类型。

  • 不同的参数列表长度(在 __cdecl上,只在从较长列表到较短列表的转换上,即使较短列表是 varargs)。

  • 指向数据的指针(除 void* 以外)以指向函数的指针作为别名。

  • 其他任何可能在 reinterpret_cast 上产生错误或警告的类型差异。

通过结果指针调用该函数可能导致程序崩溃。

默认情况下关闭此警告。有关更多信息,请参见默认情况下处于关闭状态的编译器警告

下面的示例生成 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
};