gpt4 book ai didi

c++ - 函数指针赋值在 C 中有效,但在 C++ 中无效

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:52 27 4
gpt4 key购买 nike

我需要在 Mac OS X 的运行时动态链接到库函数。关注 Apple's example ,我声明了一个函数指针并用 dlsym() 的结果赋值给它。以下示例成功编译为纯 C (.c) 文件。但我需要在 C++ 文件中使用它,如果我将此示例编译为 C++ 文件 (.cpp),clang 编译器会告诉我

无法使用“void ”类型的右值初始化“void ()(char *)”类型的变量

为什么它在纯“C”中工作,我该如何解决这个问题?

#include <dlfcn.h>

void Test() {
// Load the library which defines myFunc
void* lib_handle = dlopen("myLib.dylib", RTLD_LOCAL|RTLD_LAZY);

// The following line is an error if compiled as C++
void (*myFunc)(char*) = dlsym(lib_handle, "myFunc");

myFunc("Hello");

dlclose(lib_handle) ;
}

最佳答案

dlsym 返回 void*。在 POSIX 中(但不是标准的 C,正如 James 指出的那样)有一个从 void* 到函数指针类型的隐式转换,所以对 myFunc 的赋值就可以了.在 C++ 中没有隐式转换(因为它不是类型安全的),因此您需要通过添加强制转换来告诉编译器您的意思是:

void (*myFunc)(char*) = (void(*)(char*))dlsym(lib_handle, "myFunc");

(或者您可以使用 reinterpret_cast)。

关于c++ - 函数指针赋值在 C 中有效,但在 C++ 中无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16863544/

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