Aviso do Compilador (nível 3, desativado) C4191
'operação': conversão insegura de 'tipo_de_expressão' para 'tipo_necessário'
Fazer uma chamada de função usando o ponteiro resultante pode fazer com que seu programa falhe
Várias operações envolvendo ponteiros de função são consideradas inseguras:
Tipos de função com diferentes convenções de chamada.
Tipos de função com diferentes convenções de retorno.
Tipos de argumento ou retorno com diferentes tamanhos, categorias de tipo ou classificações.
Diferentes comprimentos de lista de argumentos (em
__cdecl
, somente na conversão da lista mais longa para a mais curta, mesmo que a mais curta seja varargs).Ponteiro para dados (exceto
void*
) com alias em um ponteiro para funcionar.Qualquer outra diferença de tipo que geraria um erro ou aviso em uma
reinterpret_cast
.
Chamar essa função por meio do ponteiro de resultado pode fazer com que o programa falhe.
Esse aviso está desativado por padrão. Para obter mais informações, confira Avisos do compilador desativados por padrão.
A amostra a seguir gera 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
};