【问题标题】:Linking to C libraries from C++: why isn't extern always needed?从 C++ 链接到 C 库:为什么不总是需要 extern?
【发布时间】:2019-01-30 12:06:07
【问题描述】:

通常要让 C 库在 C++ 中工作,您必须将其包含在 extern "C" { #include <clibrary.h> } 中。许多库将在其头文件中包含 #ifdef __cplusplus extern "C" { ... 之类的代码,以使它们对 C++ 代码更加用户友好(例如 pthread.h)。有时情况并非如此。例如,stdio.h 没有这样的#ifdef,但我仍然可以使用 C++ 编译器编译和链接通常的#include <stdio.h> int main() {printf("Hello");},而无需将其包装在extern "C" 语句中。为什么是这样?

【问题讨论】:

  • 1.因为您应该在 C++ 中使用 cstdio。 2. 不,99% 的 stdio.h 在这个 macro 中有 extern "C"
  • @KamilCuk stdio.h vs cstdio 与此完全无关。
  • 感谢大家的回答。我应该更仔细地看;我只是 grepped stdio.h 寻找 cplusplus 没有深入挖掘。

标签: c++ c linker


【解决方案1】:

通常要让 C 库在 C++ 中运行,您必须将其包含在 extern "C" { #include <clibrary.h> } 中。

仅当库在设计时未考虑 C++ 兼容性。但这是一个 hack。

许多库将在其头文件中包含 #ifdef __cplusplus extern "C" { ... 等代码,以使它们对 C++ 代码更加用户友好(例如 pthread.h)

是的,一个好的图书馆会做到这一点。

因此,您不需要也不应该在 #include 周围添加另一个 extern "C"。

stdio.h 是一个可以正确执行此操作的标头示例(见下文)。

例如,stdio.h 没有这样的#ifdef

当然可以! Followthemoneytrail…

为什么不总是需要 extern?

因此,总而言之,您只需要在头文件的作者没有为您执行此操作时自己执行此操作。头文件作者做的时候,你不需要做。

【讨论】:

    【解决方案2】:

    例如,stdio.h 没有这样的#ifdef

    它可能会。不管怎样,<stdio.h> 是 C++ 标准库(继承自 C 标准库)提供的一个头文件。它保证在没有extern "C" 的情况下也能像所有标准头一样工作。

    请注意,在 C++ 中使用 <name.h> 继承的标准标头名称而不是 <cname> 在当前版本的标准中已被弃用,并且已被确定为在未来修订版中删除的候选者。

    为什么不总是需要 extern?

    只是因为有些头文件被写成直接支持C++,所以自己做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2011-01-03
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多