使 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 召集會議。