11

関数ポインターとオブジェクト ポインターの間のキャストは、一般的な意味では未定義の動作ですが、POSIX (参照: dlsym ) と WinAPI (参照: GetProcAddress ) ではこれが必要です。

これを考えると、そのようなコードがとにかくプラットフォーム固有の API をターゲットにしているという事実を考えると、関数ポインターとオブジェクト ポインターに互換性がないプラットフォームへの移植性は実際には無関係です。

しかし-Wpedanticはとにかくそれについて警告し、#pragma GCC diagnostic ignored "-Wpedantic"効果はありません:

warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [enabled by default]

-Wpedanticは適切な警告を表示するため、有効にしておきたいのですが、関数ポインターからオブジェクト ポインターへのキャストに関する無関係な警告の海の中で実際の警告やエラーが失われることは望ましくありません。

これを達成する方法はありますか?

Windows (MinGW) で GCC 4.8.0 を実行:

gcc (rubenvb-4.8.0) 4.8.0

コードサンプル

#include <windows.h>
#include <iostream>


int main (void) {

    std::cout << *reinterpret_cast<int *>(GetProcAddress(LoadLibraryA("test.dll"),"five")) << std::endl;

}

エミット( -Wpedanticを使用):

warning_demo.cpp: In function 'int main()':
warning_demo.cpp:7:87: warning: ISO C++ forbids casting between pointer-to-funct
ion and pointer-to-object [enabled by default]
  std::cout << *reinterpret_cast<int *>(GetProcAddress(LoadLibraryA("test.dll"),
"five")) << std::endl;

       ^
4

3 に答える 3

4

system_headerここで g++ のディレクティブを使用できると思います。

wrap_GetProcAddress.h:

#ifndef wrap_GetProcAddress_included
#define wrap_GetProcAddress_included

#pragma GCC system_header

template <typename Result>
Result GetProcAddressAs( [normal parameters] )
{
    return reinterpret_cast<Result>(GetProcAddressAs( [normal parameters] ));
}

#endif
于 2013-04-15T23:49:15.700 に答える