다음을 통해 공유


컴파일러 경고(수준 3, 해제) C4191

'작업': '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
};