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

yur*_*hek 13 c c++ cross-language extern linkage

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

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

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

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

我试过:

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

th3*_*3lf 5

extern "C" {

static int my_callback(int a)
{
    return a + 1;
}

}
Run Code Online (Sandbox Code Playgroud)

上面的代码编译得很好。该符号在翻译单元之外不可见,您可以通过指针调用该函数。

您可以将此函数从该文件中传递给您的 C 代码,并确保它不会污染您的全局命名空间。

  • 尝试从不同的翻译单元调用它。我自己尝试了一下,得到了一个未定义的参考错误,这意味着这个解决方案有效。 (3认同)
  • @yurikilochek 你能详细说明一下吗? (2认同)
  • @yurikilochek 仍然,您的“f”函数无法从另一个文件访问,因此您可以将它和引用它的 C++ 函数放在一个单独的文件中,然后就到此为止了。我认为 gcc 正在根据标准做正确的事情。 (2认同)