gpt4 book ai didi

c++ - 如何解决有关使用 FARPROC 调用 GetProcAddress 的 C4191 警告?

转载 作者:可可西里 更新时间:2023-11-01 16:31:49 25 4
gpt4 key购买 nike

最近我尝试使用 /Wall Visual C++ option启用所有警告,发现如下代码:

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 风格转换,会出现相同的警告,但现在它提到“type cast”而不是“reinterpret_cast”。

对于我调用 GetProcAddress() 并将其返回值转换为某个可用函数指针的任何情况,都会重复相同的警告。

如何处理这些警告?我需要更改我的代码吗?

最佳答案

正如其他答案已经提到的,这是一个有用的警告。 Normally, this type of coercion would be a serious bug hiding in your application .

因此,您可能不想使用编译器开关全局禁用它。但是您仍然需要调用 GetProcAddress ,并且您希望您的构建能够在没有警告的情况下干净地编译。

您有两个不错的选择:

  1. 使用特定于 MSVC 的编译指示抑制每个单独的警告。在恶意转换上方的新行中,添加以下代码:

    #pragma warning(suppress: 4191)

    抑制了下一行代码的警告,确保它不会被全局抑制,如果你试图在代码库的其他地方做一些愚蠢的事情,你仍然会收到警告.当然,每次使用 GetProcAddress 时都需要添加它,这有点痛苦。更糟糕的是,它是一个不可移植的、特定于 MSVC 的扩展,会丑化您的代码。

    所以,或者……

  2. 您可以通过显式转换 GetProcAddress 的结果来消除警告 (a FARPROC ) void* ,然后转换为 void*到特定的函数指针类型。例如:

    typedef BOOL ( __stdcall *TIsWow64ProcessFunction )( HANDLE, BOOL* );

    TIsWow64ProcessFunction isWow64ProcessFunction =
    reinterpret_cast<TIsWow64ProcessFunction>(
    reinterpret_cast<void*>(
    ::GetProcAddress(hInstance, "IsWow64Process")));

    这种方法适用于其他编译器,稍微不那么难看,而且可以说在语义上更有意义。

关于c++ - 如何解决有关使用 FARPROC 调用 GetProcAddress 的 C4191 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4192058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com