gpt4 book ai didi

c++ - GCC 警告将函数指针转换为对象指针

转载 作者:可可西里 更新时间:2023-11-01 15:20:10 26 4
gpt4 key购买 nike

显然,函数指针和对象指针之间的转换在一般意义上是未定义的行为,但 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;

^

最佳答案

我想你可以在这里使用 g++ 的 system_header 指令:

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

关于c++ - GCC 警告将函数指针转换为对象指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16026183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com