Четкое литье между указателями функций и указателями объектов - это поведение undefined в общем смысле, но 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 включен, так как он дает хорошие предупреждения, но я не хочу иметь реальные предупреждения и ошибки, потерянные в море нерелевантных предупреждений о указателе на указатели на указатели объектов.
Есть ли способ сделать это?
Запуск GCC 4.8.0 в Windows (MinGW):
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;
^