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