Недавно я попытался использовать параметр /Wall Visual C++ для включения всех предупреждений и обнаружил, что следующий код:
typedef BOOL ( WINAPI * TIsWow64ProcessFunction )( HANDLE, BOOL* );
TIsWow64ProcessFunction isWow64ProcessFunction = reinterpret_cast<TIsWow64ProcessFunction> (
::GetProcAddress( kernel32DllHandle, "IsWow64Process" ) );
породил C4191:
warning C4191: 'reinterpret_cast' : unsafe conversion from 'FARPROC' to 'TIsWow64ProcessFunction'
Calling this function through the result pointer may cause your program to fail
Если я использую приведение в стиле C, появляется такое же предупреждение, но теперь в нем упоминается «приведение типов» вместо «reinterpret_cast».
То же самое предупреждение повторяется для любого случая, когда я вызываю GetProcAddress()
и преобразую его возвращаемое значение в какой-нибудь пригодный для использования указатель на функцию.
Как мне реагировать на эти предупреждения? Нужно ли мне вносить изменения в мой код?
pragma warning(once: 4191 4242 4263 4264 4266 4302 4826 4905 4906 4928)
. См. также Предупреждения компилятора «Отключено по умолчанию» в Visual C++ в блоге Microsoft. - person jww   schedule 04.09.2015GetProcAddress
кVOIDP
илиvoid*
. Затем вы можете привести к чему угодно, напримерTIsWow64ProcessFunction
. Для полноты картины Clang тоже иногда требует этого хака. Это не ограничивается компиляторами MS. - person jww   schedule 10.10.2016