【发布时间】:2016-06-20 16:23:01
【问题描述】:
我在一个 cpp 文件中看到 external "C" {...} 包含了几个函数的定义。
从https://isocpp.org/wiki/faq/mixing-c-and-cpp,我猜想在cpp 文件中使用extern "C" 的目的是为了使封闭的C++ 函数可以在C 程序中使用。
链接中的示例显示extern "C" 仅包含 C++ 函数的声明,而不包含它们的定义
只需声明 C++ 函数 extern "C"(在您的 C++ 代码中)并调用 它(来自您的 C 或 C++ 代码)。例如:
// C++ code: extern "C" void f(int); void f(int i) { // ... }
我一开始提到的cpp文件看起来是这样的:
// C++ code:
extern "C" {
void f(int i)
{
// ...
}
void g(int i)
{
// ...
}
}
extern "C" 应包含 C++ 函数的声明或定义吗?
如果有,为什么?
【问题讨论】:
-
@Alex 它并没有真正更改 ABI,只是名称修改。
-
请记住,定义也是一个声明,[dcl.link] 7.5/6 可能会很有趣。
-
在第一种情况下,第二个函数 f 没有使用 C 命名链接。您可以通过转储生成对象的符号来检查这一点。
-
@xryl669 如果没有,你有一个编译器错误。
-
@πάνταῥεῖ` “只是名称 mangling” 7.5/1 “特定语言链接可能与表示具有外部链接的对象和函数名称的特定形式相关联(mangling---n.m.),或使用特定的调用约定(ABI---n.m.)”。 “具有不同语言链接的两种函数类型是不同的类型,即使它们在其他方面是相同的。” 5.2.2 “通过函数类型具有与被调用函数定义的函数类型的语言链接不同的语言链接的表达式调用函数未定义”。