関数ポインターとオブジェクト ポインターの間のキャストは、一般的な意味では未定義の動作ですが、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;
^