相关疑难解决方法(0)

声明一个具有 C 调用约定但具有内部链接的 C++ 函数

我正在尝试与 C 库交互,该库希望我提供一个指向回调函数的指针。

据我了解,根据标准,由于调用约定可能不同,回调必须具有 C语言链接。我可以通过将回调函数声明为extern "C". 然而,这有一个不受欢迎的副作用:将函数的未限定和未混淆的名称暴露给其他翻译单元。

是否可以声明一个函数,使其名称具有内部链接(对其他翻译单元不可见),但可以仅使用标准 C++ 通过指针(具有适当的调用约定)从 C 调用?

如果不可能让它有内部链接,至少有可能让它保持它的 C++ 名称修改吗?

我试过:

  • 将其声明为static extern "C" void f();which 导致编译错误,从而导致staticextern "C"不能一起使用。
  • 在匿名命名空间中声明它namespace { extern "C" void f(); },结果证明与常规命名空间具有相同的效果,暴露了未修饰的非限定名称。

c c++ cross-language extern linkage

13
推荐指数
1
解决办法
287
查看次数

C++使用类方法作为函数指针类型

在C lib中,有一个函数在等待函数指针,这样:

lasvm_kcache_t* lasvm_kcache_create(lasvm_kernel_t kernelfunc, void *closure)
Run Code Online (Sandbox Code Playgroud)

其中lasvm_kernel_t定义为:

typedef double (*lasvm_kernel_t)(int i, int j, void* closure);
Run Code Online (Sandbox Code Playgroud)

现在,如果我将类中定义的方法发送到lasvm_kcache_create:

double cls_lasvm::kernel(int i, int j, void *kparam)
...
lasvm_kcache_t *kcache=lasvm_kcache_create(&kernel, NULL);
Run Code Online (Sandbox Code Playgroud)

我得到:"无法将'double(cls_lasvm :: )(int,int,void)'转换为'double()(int,int,void)'"

我该怎么办?

c++ function-pointers

3
推荐指数
1
解决办法
1万
查看次数

标签 统计

c++ ×2

c ×1

cross-language ×1

extern ×1

function-pointers ×1

linkage ×1