使 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 召集会议。