c++ - 从类型 ‘void*’ 到函数指针的强制转换无效

标签 c++

我想使用 LD_PRELOAD 覆盖 libcopen:

#include <dlfcn.h>
#include <sys/stat.h>

extern "C" {

int open(const char *path, int flags, mode_t mode)
{
    int (*originalOpen)(const char *path, int flags, mode_t mode);
    originalOpen = reinterpret_cast<decltype(originalOpen)>(dlsym(RTLD_NEXT, "open"));
    //originalOpen = reinterpret_cast<decltype(open)>(dlsym(RTLD_NEXT, "open"));
    //...
    return (*originalOpen)(path, flags, mode);
}

}

我用 g++ -fPIC -shared -o open.so open.cpp -ldl 编译。

有人能告诉我为什么上面的代码有效,为什么会出现错误:

error: invalid cast from type ‘void*’ to type ‘int(const char*, int, mode_t)’ {aka ‘int(const char*, int, unsigned int)’}
  originalOpen = reinterpret_cast<decltype(open)>(dlsym(RTLD_NEXT, "open"));

当我用注释掉的行初始化 originalOpen 时?

我使用的是 gcc 8.0.1 版

最佳答案

试试这段代码:

originalOpen = reinterpret_cast<decltype(open) *>(dlsym(RTLD_NEXT, "open"));

当您想创建函数指针时,Decltype 获取函数的类型。从函数到其类型的指针存在隐式转换,但它们并不等同。这就是带有 decltype(original_open) 的版本完美运行的原因 - original_open 的类型是函数指针而不是函数。

关于c++ - 从类型 ‘void*’ 到函数指针的强制转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51474619/

相关文章:

c++ - 明确的概念特化

c++ - 将 C++ builder 6 项目转换为 C++ builder 2010

c++ - 链表和结构数组之间的区别?

c++ - 如何在 C 中模拟命名空间?

c++ - Unicode 字符 "GREEK CAPITAL LETTER DELTA"在 C++ 和 GLStudio 中呈现为 "White vertical rectangle"

c++ - 如何在应用程序中嵌入数据

c++ - 如何在Flex中读取标识符 'class'?

c++ - 继承和虚拟方法

c++ - 可以在模板化的 typedef 上使用模板特化吗?

c++ - 用户定义指针双端队列中的段错误