Gần đây tôi cố gắng sử dụng /Wall Visual C++ option để cho phép tất cả các cảnh báo và phát hiện ra rằng đoạn mã sau:Làm thế nào để giải quyết cảnh báo C4191 xung quanh các cuộc gọi đến GetProcAddress với FARPROC?
typedef BOOL (WINAPI * TIsWow64ProcessFunction)(HANDLE, BOOL*);
TIsWow64ProcessFunction isWow64ProcessFunction = reinterpret_cast<TIsWow64ProcessFunction> (
::GetProcAddress(kernel32DllHandle, "IsWow64Process"));
sinh ra C4191:
warning C4191: 'reinterpret_cast' : unsafe conversion from 'FARPROC' to 'TIsWow64ProcessFunction'
Calling this function through the result pointer may cause your program to fail
Nếu tôi sử dụng một C-style cast cảnh báo tương tự xuất hiện nhưng bây giờ nó đề cập đến "type cast" thay vì "reinterpret_cast".
Cảnh báo tương tự được lặp lại cho mọi trường hợp tôi gọi GetProcAddress()
và chuyển giá trị trả về của nó thành một số con trỏ hàm có thể sử dụng.
Làm cách nào để giải quyết các cảnh báo này? Tôi có cần thay đổi mã của mình không?
#pragma warning (disable: 4191) có vẻ thích hợp nếu mục tiêu đạt 0 cảnh báo: Cảnh báo cụ thể này là vô ích khi không có (rõ ràng) cách để tránh khi giữ chức năng. –
Nó có cảnh báo cho bạn không? Tôi không bao giờ sử dụng/tường, chỉ có mức cảnh báo P4 trong VS. typedef BOOL (WINAPI * DISABLEREDIR) (PVOID *); DISABLEREDIR fpnDisableRedir = NULL; fpnDisableRedir = (DISABLEREDIR) GetProcAddress (hKernel32, "Wow64DisableWow64FsRedirection"); – Kra
@Kra: Vâng, nó sinh ra C4191 với/Wall. Điều quan trọng là C4191 bị vô hiệu hóa theo mặc định và/Wall cho phép nó. – sharptooth