Wyraźne rzutowanie między wskaźnikami funkcji a wskaźnikami obiektów jest niezdefiniowanym zachowaniem w sensie ogólnym, ale wymaga tego POSIX (patrz: dlsym) i WinAPI (patrz: GetProcAddress).GCC ostrzega o wskaźniku funkcji do wskaźnika obiektu Obsłużenie
Biorąc to pod uwagę i biorąc pod uwagę fakt, że taki kod jest ukierunkowany na API specyficzne dla platformy, jego przenośność na platformy, na których wskaźniki funkcji i wskaźniki obiektów nie są kompatybilne, jest naprawdę nieistotna.
Ale -Wpedantic ostrzega o nim tak, i nie ma żadnego wpływu #pragma GCC diagnostic ignored "-Wpedantic"
:
warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [enabled by default]
chcę zachować -Wpedantic włączona, ponieważ daje dobre ostrzeżenia, ale nie chcę aby prawdziwe ostrzeżenia i błędy zostały utracone w morzu nieistotnych ostrzeżeń o wskaźniku funkcji, aby rzucić obiekt po rzutach.
Czy istnieje sposób, aby to osiągnąć?
Running GCC 4.8.0 na Windows (MinGW):
gcc (rubenvb-4.8.0) 4.8.0
Przykładowy kod
#include <windows.h>
#include <iostream>
int main (void) {
std::cout << *reinterpret_cast<int *>(GetProcAddress(LoadLibraryA("test.dll"),"five")) << std::endl;
}
Emitowane (z -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;
^
Nigdy nie miałem problemu z rzuceniem wyniku "GetProcAddress". – chris
Czy masz * kod *, który wygenerował to ostrzeżenie, które możesz opublikować? – WhozCraig
@WhozCraig Dodano do pytania. –