【发布时间】:2020-01-28 12:42:13
【问题描述】:
我正在尝试与 C 库交互,它希望我提供指向回调函数的指针。
据我了解,根据标准,由于调用约定可能不同,回调必须具有 C 语言链接。我可以通过将我的回调函数声明为extern "C" 来实现这一点。然而,这有一个不受欢迎的副作用:将函数的未限定和未修改的名称暴露给其他翻译单元。
是否可以声明一个函数,使其名称具有内部链接(对其他翻译单元不可见),但可以通过指针从 C 调用(具有适当的调用约定)使用只有标准的 C++?
如果不可能使其具有内部链接,是否至少可以使其保持其 C++ 名称重整?
我试过了:
- 将其声明为
static extern "C" void f();导致编译错误,大意是static和extern "C"不能一起使用。 - 在匿名命名空间中将其声明为
namespace { extern "C" void f(); },结果证明与常规命名空间具有相同的效果,从而暴露了未损坏的未限定名称。
【问题讨论】:
-
无需声明函数
extern "C"。所需要的只是函数接受指向具有适当类型的参数和返回类型的函数的指针。接受指向函数的指针的函数不会从调用者那里获得有关传递函数名称的信息 - 被修改或其他方式。显然,类型必须在 C 中有效。我假设您没有使用任何编译器特定的关键字或调用约定。 -
@Peter 在answer 到linked question 上的this comment 怎么样?这声称 C 和 C++ 函数之间的调用约定可能不同,因此在
extern "C" {}中声明函数似乎更安全。 -
@KamilCuk 不保证适用于所有平台。这里有一些讨论:stackoverflow.com/questions/36941866/…
标签: c++ c extern linkage cross-language