Поделиться через


Предупреждение компилятора (уровень 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
};