【问题标题】:What exactly do I lose when using extern "C" in C++? [duplicate]在 C++ 中使用 extern "C" 时我到底失去了什么? [复制]
【发布时间】:2012-11-20 10:28:31
【问题描述】:

我正在尝试用 C++ 开发一个动态库,以便由用 IDL(交互式数据语言)编写的现有程序调用。我知道我需要使用 extern "C" 来禁用名称修饰,以便 IDL 可以调用它需要的函数(调用机制的其余部分非常简单)。

但是,我总是对使用我不完全理解的语言的特性犹豫不决,所以我的问题是:如果有的话,我会因为恢复到 C 链接而失去 C++ 的哪些特性?我认为命名空间是显而易见的,但它是否也完全禁用了 C++ 的所有其他不错的功能?我还能使用 C++ STL 以及我所依赖的所有各种语言特性(尤其是 C++11 特性)吗?还是我基本上被困在 C 语言中?

【问题讨论】:

  • 看看C++ Name Mangling。您将无法使用 extern "C" 进行函数重载。
  • 谢谢 :) 但是我还能使用 C++ 的其他特性吗,还是函数中的所有内容都必须是严格的 C?例如,我可以使用“del”、lambdas 或现有 C++ 标准库之类的关键字吗?
  • 它(extern "C" 部分下的所有内容)必须严格使用 C,因为它必须与 C 兼容。因此是“extern C”
  • “我总是对使用我不完全理解的语言的特性犹豫不决”如果他们不使用他们不完全理解的特性,很少有人能写出很多 C++... ;)

标签: c++ c extern linkage


【解决方案1】:

唯一被删除的是外部可见名称的name mangling。参数类型以及参数计数的函数重载将因此停止工作。本质上,链接阶段的名称解析会回到普通的旧 C 模式(即一个名称 - 一个条目)。

就实现的内部结构而言,您可以继续使用标准库和 C++11 的所有其他不错的功能。 extern C 仅更改外部可见实体的名称。

【讨论】:

  • 谢谢,这正是我想要的保证:)
  • 在函数体中使用STL是可以的。使用 STL 作为参数或返回类型可能会很麻烦。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 2012-09-15
  • 2019-07-21
  • 1970-01-01
  • 2011-02-17
  • 2013-10-12
  • 2015-12-30
  • 1970-01-01
相关资源
最近更新 更多