使 C 库头与 C 兼容

AC 库头通常可以包含在 C++程序中,因为大多数声明在 C 和 C++中都有效。例如,考虑以下 foo.h

typedef struct Foo {
    int bar;
} Foo;
Foo make_foo(int);

make_foo 的定义是单独编译的,并以对象形式的头部分发。

一个 C++程序可以使用 #include <foo.h>,但编译器不会知道 make_foo 函数被定义为 C 符号,并且可能会尝试使用错位名称来查找它,并且无法找到它。即使它可以在库中找到 make_foo 的定义,并非所有平台都使用相同的 C 和 C++调用约定,并且 C++编译器在调用 make_foo 时将使用 C++调用约定,如果 make_foo 可能会导致分段错误期待用 C 调用约定调用。

解决这个问题的方法是在 extern "C" 块中包含几乎所有声明。

#ifdef __cplusplus
extern "C" {
#endif

typedef struct Foo {
    int bar;
} Foo;
Foo make_foo(int);

#ifdef __cplusplus
}  /* end of "extern C" block */
#endif

现在当 foo.h 包含在一个 C 程序中时,它只会显示为普通声明,但是当从一个 C++程序中包含 foo.h 时,make_foo 将位于一个 extern "C" 块中,编译器将知道查找一个未编码的名称并使用 C 召集会议。