在 extern "C" { ... } 中包装标准 C++ 标头的 #include 指令?

Wrapping a #include directive for a standard C++ header in extern "C" { ... }?

本文关键字:指令 C++ #include 包装 extern 标准      更新时间:2023-10-16

我最近在一个.h文件的开头看到了这个块。

#ifdef __cplusplus
  extern "C" {
  #include <cstddef>
  #include <cstdint>
#else
  #include <stddef.h>
  #include <stdint.h>
#endif /* __cplusplus */

包装#include指令的标准c++头在extern "C" { ...实际上做什么?在功能上是否与:

不同?
#ifdef __cplusplus
  #include <cstddef>
  #include <cstdint>
  extern "C" {
#else
  #include <stddef.h>
  #include <stdint.h>
#endif /* __cplusplus */

我一直以为这没什么区别,但我看到它太频繁了,我开始好奇了。

根据头文件中的"If…def"语句,

"if" block: "if你在c++中使用特定的头文件"

"else" block: "如果你使用的不是c++的特定头文件,可能是C"

如果你没有将"extern C"中的头文件包装在"if"块中(这意味着c++),那么函数名的"C"链接将不会被维护。

"C"没有函数重载的概念,但在c++中。所以c++编译器对"extern C"函数做了一些函数名混淆。

这是一篇很好的文章。在c++源码中,extern " C "的作用是什么?

对于常规的标准C库,不需要外部包装器。大多数情况下由标准c负责。

示例:如下所示(windows上的yvals.h)

  #define _C_LIB_DECL       extern "C" {    /* C has extern "C" linkage */
  #define _END_C_LIB_DECL   }
  #define _EXTERN_C         extern "C" {
  #define _END_EXTERN_C     }