将 extern "C"
放入 C++ 代码到底有什么作用?
例如:
extern "C" {
void foo();
}
原文由 Litherum 发布,翻译遵循 CC BY-SA 4.0 许可协议
将 extern "C"
放入 C++ 代码到底有什么作用?
例如:
extern "C" {
void foo();
}
原文由 Litherum 发布,翻译遵循 CC BY-SA 4.0 许可协议
C编译器编译的函数void f()和C++编译器编译的同名函数void f()不是同一个函数。如果您在 C 中编写了该函数,然后您尝试从 C++ 调用它,那么链接器将查找 C++ 函数但找不到 C 函数。
extern “C” 告诉 C++ 编译器你有一个由 C 编译器编译的函数。一旦你告诉它它是由 C 编译器编译的,C++ 编译器就会知道如何正确调用它。
它还允许 C++ 编译器以 C 编译器可以调用它的方式编译 C++ 函数。该函数将正式成为 C 函数,但由于它是由 C++ 编译器编译的,因此它可以使用所有 C++ 功能并具有所有 C++ 关键字。
原文由 gnasher729 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
extern "C"
使 C++ 中的函数名具有 C 链接(编译器不会破坏名称),以便客户端 C 代码可以使用仅包含声明的 C 兼容头文件链接到(使用)您的函数你的功能。您的函数定义包含在二进制格式(由您的 C++ 编译器编译)中,然后客户端 C 链接器将使用 C 名称链接到该格式。由于 C++ 有函数名重载,而 C 没有,C++ 编译器不能只使用函数名作为链接的唯一 id,因此它通过添加有关参数的信息来破坏名称。 AC 编译器不需要修改名称,因为您不能在 C 中重载函数名称。当您声明一个函数在 C++ 中具有
extern "C"
链接时,C++ 编译器不会将参数/参数类型信息添加到用于链接的名称。如您所知,您可以明确指定
extern "C"
链接到每个单独的声明/定义,或使用块将声明/定义序列分组以具有一定的链接:如果您关心技术细节,它们在 C++03 标准的第 7.5 节中列出,这里是一个简短的摘要(重点是
extern "C"
):extern "C"
是一个链接规范extern "C"
被类成员忽略extern "C"
强制函数具有外部链接(不能使其静态) 参见 Richard 的评论:static
insideextern "C"
是有效的;如此声明的实体具有内部链接,因此没有语言链接