如何重新定义 C++ 指针函数?
How to redefine c++ pointer function?
我有来自BASS库的代码。
#ifndef BASSDEF
#define BASSDEF(f) WINAPI f
#else
#define NOBASSOVERLOADS
#endif
HSAMPLE BASSDEF(BASS_SampleLoad)(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);
我需要重新定义 BASSDEF 来调用 dlsym 函数。我该怎么做?
更新:
我在Android NDK(Linux(上使用它,我通过函数dlopen加载了低音模块,我需要通过dlsym函数使所有函数都指向这个加载的模块(这是低音库 https://pastebin.com/Z2Ty9UsY 的原始头文件(。我需要它来轻松调用所有函数(从 bass.so 中的 JNI(模块。
实际上,BASSDEF不是一个函数。它是在编译时已知的宏。因此,让我们自己解开它:
HSAMPLE WINAPI BASS_SampleLoad(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);
哇,只是这里的函数声明。现在"WINAPI"基本上__stdcall调用约定(特定于Microsoft(。但是,查看您提供的 BASS 标头,可以找到非 WIN32 系统:
#define WINAPI
基本上,在Linux下,它只是一个占位符,可以扩展到任何内容。现在函数声明如下所示:
HSAMPLE BASS_SampleLoad(BOOL mem, const void *file, QWORD offset, DWORD length, DWORD max, DWORD flags);
下一步是什么?您想通过dlsym在某个共享库中找到此函数吗?
我假设你想要这样的东西:
// Declare a function pointer in C++11 style
using BASS_SampleLoad_FuncPtr = std::add_pointer<decltype(BASS_SampleLoad)>::type;
// Open library you wants
void* soHandle = dlopen("your_lib_here.so", RTLD_LAZY);
// Error check!
if (nullptr == soHandle) {
// Fail here
}
// Finally, get pointe to function!
BASS_SampleLoad_FuncPtr BASS_SampleLoad = reinterpret_cast<BASS_SampleLoad_FuncPtr>(dlsym(soHandle, "BASS_SampleLoad"));
// Error check!
if (nullptr == BASS_SampleLoad) {
// Fail here
}
// Now only here it's safe to call "BASS_SampleLoad" with required params
auto sample = BASS_SampleLoad(...);
...
// Don't forget to close lib
dlclose(soHandle);
请注意! 提供的代码未经测试,可能包含错误。而且,它是C++11标准。
此外,对于 C++14 及更高版本,将">std::add_pointer<...>::type"替换为">std::add_pointer_t<...>">
附言:这段代码是有效的,因为BASS是跨平台的库,所有WinAPI看起来像的东西(WINAPI,QWORD,BOOL,DWORD等(都是在BASS标头中为Linux定义的
。相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针