This question already has an answer here:
extern “C” static void* function
(1个答案)
去年关闭。
我正在尝试与C库进行接口(interface),该库希望我提供指向回调函数的指针。
据我了解,由于可能不同的调用约定,根据标准,回调必须具有C语言链接。我可以通过将回调函数声明为
是否可以声明一个函数,使其名称具有内部链接(对于其他翻译单元不可见),但可以仅使用标准C++通过C进行调用(具有适当的调用约定)?
如果不可能使其具有内部链接,至少是否可以使其保持C++名称困惑?
我试过了:
声明为 在匿名 namespace 中将其声明为
上面的代码编译得很好。该符号在翻译单元外部不可见,您可以通过指针调用该函数。
您可以从此文件中将此函数传递给C代码,并确保它不会污染您的全局 namespace 。
(1个答案)
去年关闭。
我正在尝试与C库进行接口(interface),该库希望我提供指向回调函数的指针。
据我了解,由于可能不同的调用约定,根据标准,回调必须具有C语言链接。我可以通过将回调函数声明为
extern "C"
来实现此目的。但是,这会带来不希望的副作用:将函数的不合格且无歧义的名称暴露给其他翻译单元。是否可以声明一个函数,使其名称具有内部链接(对于其他翻译单元不可见),但可以仅使用标准C++通过C进行调用(具有适当的调用约定)?
如果不可能使其具有内部链接,至少是否可以使其保持C++名称困惑?
我试过了:
static extern "C" void f();
会导致编译错误,导致static
和extern "C"
不能一起使用。 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/