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