Очевидно, что отличное отключение между указателями функций и указателями объектов является неопределенным поведением в общем смысле, но POSIX (см.: dlsym) и WinAPI (см.: GetProcAddress) требуют этого.GCC предупреждает о функции Указатель на указатель на объект Cast
Учитывая это, и учитывая тот факт, что такой код нацелен на 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;
^
У меня никогда не было проблемы с выдачей результата «GetProcAddress». – chris
У вас есть * код *, который сгенерировал это предупреждение, которое вы можете отправить? – WhozCraig
@WhozCraig Добавлено в вопрос. –