This question already has an answer here:
extern “C” static void* function

(1个答案)


去年关闭。




我正在尝试与C库进行接口(interface),该库希望我提供指向回调函数的指针。

据我了解,由于可能不同的调用约定,根据标准,回调必须具有C语言链接。我可以通过将回调函数声明为extern "C"来实现此目的。但是,这会带来不希望的副作用:将函数的不合格且无歧义的名称暴露给其他翻译单元。

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

如果不可能使其具有内部链接,至少是否可以使其保持C++名称困惑?

我试过了:
  • 声明为static extern "C" void f();会导致编译错误,导致staticextern "C"不能一起使用。
  • 在匿名 namespace 中将其声明为namespace { extern "C" void f(); },结果与常规 namespace 具有相同的作用,从而暴露出无歧义的非限定名称。
  • 最佳答案

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

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

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

    关于c++ - 声明具有C调用约定但内部链接的C++函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59949022/

    10-11 23:06
    查看更多