【问题标题】:What are potential disadvantages of using extern "C"?使用 extern "C" 的潜在缺点是什么?
【发布时间】:2017-09-08 12:40:49
【问题描述】:

我读过

但是,我还没有找到一个问题的答案:使用extern "C"(例如,在尽可能多的功能上)是否存在(将来可能)不利之处?

更具体地说:在接口只使用C功能的函数中添加extern "C"有什么缺点吗?换句话说,那些不使用@k-five 的答案中列出的功能的那些?

【问题讨论】:

  • extern "C" 是有目的的。你的问题的答案取决于你假设它的利弊的背景。
  • 缺点是不能使用 C++ 的东西,比如重载或成员函数。而且你必须编写更多没有真正做任何事情的代码。
  • 尽管它的名字,这与 C 语言/标准无关。
  • 有没有提到如何在没有它的情况下调用 C-ABI 函数?
  • “劣势”是什么意思?如果你买了一辆自行车,你不能用它运输一架大钢琴是不是一个缺点?那不是自行车的用途!不要用螺丝刀敲钉子。

标签: c++ extern


【解决方案1】:

缺点是你只能使用extern "C"函数的接口中的功能,而这些功能也可用于C函数。

这意味着:
1. 函数参数不能使用默认值,
2. 不能使用引用参数,
3. 不能按值传递 C++ 类(包括智能指针),
4.你不能传递enum class参数,
5.你不能通过bool而不将其转换为int
6. 你不能重载这些函数,可能还有更多我现在想不起来的函数。

【讨论】:

  • 我不认为这是一个不利因素,因为这就是构造的目的。 (顺便说一句:C 布尔类型;转换为int 没有用处。
  • @Olaf 将所有内容都包装在extern "C" 中是不利的,因为那时您正在编写既不现代C 也不现代C++
  • 这个答案具有误导性。您可以内部 extern "C" 函数中使用 C++ 功能。你不能做的是在声明中使用 C++ 特性。但在实现中使用std::vector<std::string> 没有问题。不确定 C++ bool 是否与 C99 _Boolean 匹配,但他的预期是合理的。
  • 这不是缺点,但不是extern "C" 的目的。如果您想编写 C 代码,请使用 C 编译器,无论如何您都不能在 C++ 编译器中编写 C 代码 - 无论是否包含在 extern "C" 中。你不能开车飞行的事实并不是街车的缺点,它只是一种财产。不要用螺丝刀敲钉子。
  • @MSalters: 在 C 中是 _Bool ;-)
猜你喜欢
  • 2013-05-09
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 2010-09-08
  • 2012-03-29
  • 1970-01-01
相关资源
最近更新 更多