声明一个具有 C 调用约定但内部链接的 C++ 函数
Declare a C++ function that has C calling convention but internal linkage
我正在尝试与 C 库交互,它希望我提供指向回调函数的指针。
据我了解,根据标准,由于调用约定可能不同,回调必须具有 C 语言链接。我可以通过将回调函数声明为 extern "C"
来完成此操作。然而,这有一个不良的副作用:将函数的非限定和未损坏的名称暴露给其他翻译单元。
是否可以声明一个函数,使其名称具有 内部链接(对其他翻译单元不可见),但可以通过指针从 C 调用(具有适当的调用约定)仅使用标准 C++?
如果不可能使其具有 内部链接,是否至少可以使其保持其 C++ 名称修改?
我试过:
- 声明为
static extern "C" void f();
导致编译错误导致static
和extern "C"
不能一起使用
- 在匿名命名空间中将其声明为
namespace { extern "C" void f(); }
结果证明与常规命名空间具有相同的效果,暴露未损坏的非限定名称。
extern "C" {
static int my_callback(int a)
{
return a + 1;
}
}
上面的代码编译得很好。该符号在翻译单元外不可见,您可以通过指针调用该函数。
您可以从此文件中将此函数传递给您的 C 代码,并确保它不会污染您的全局命名空间。
我正在尝试与 C 库交互,它希望我提供指向回调函数的指针。
据我了解,根据标准,由于调用约定可能不同,回调必须具有 C 语言链接。我可以通过将回调函数声明为 extern "C"
来完成此操作。然而,这有一个不良的副作用:将函数的非限定和未损坏的名称暴露给其他翻译单元。
是否可以声明一个函数,使其名称具有 内部链接(对其他翻译单元不可见),但可以通过指针从 C 调用(具有适当的调用约定)仅使用标准 C++?
如果不可能使其具有 内部链接,是否至少可以使其保持其 C++ 名称修改?
我试过:
- 声明为
static extern "C" void f();
导致编译错误导致static
和extern "C"
不能一起使用 - 在匿名命名空间中将其声明为
namespace { extern "C" void f(); }
结果证明与常规命名空间具有相同的效果,暴露未损坏的非限定名称。
extern "C" {
static int my_callback(int a)
{
return a + 1;
}
}
上面的代码编译得很好。该符号在翻译单元外不可见,您可以通过指针调用该函数。
您可以从此文件中将此函数传递给您的 C 代码,并确保它不会污染您的全局命名空间。