2013-01-10 80 views
2

我在閱讀C++ FAQ Lite的Section 32: How to mix C and C++It says that I should strongly consider adding extern "C" {...} in my header file (adding the appropriate preprocessor directives, of course。這樣一來,我可以包含頭文件「沒有任何外部的‘C++源文件中的C’無稽之談」:在我的頭文件中加入「extern C」有什麼好處?

// Get declaration for f(int i, char c, float x) 
#include "my-C-code.h" 

的「廢話」,未說,更簡便的方法似乎是這樣的:

extern "C" { 
    // Get declaration for f(int i, char c, float x) 
    #include "my-C-code.h" 
} 

爲什麼第一個選項首選?這只是一個風格問題(以及在有人包括他們時輸入的字符數量)?

+2

應該從來沒有關閉..這是一個很好的問題。 – 2013-01-10 19:52:12

回答

3

是的,這只是一種風格的東西。但是它在使用你的圖書館時會讓人們的生活更輕鬆,所以它可能值得堅持。

+1

這不是*只是一個風格問題。在頭文件中使用「extern」C「'意味着它有一個單獨的位置,因此錯誤的可能性很小。爲每個C++翻譯單元需要它意味着您需要記住在(可能)*許多*文件中執行此操作,因此可能會增加出錯的可能性。 –

3

要麼你可以把這個語句放在你的頭文件中,或者每個使用它的人都可以把它包含在頭文件中的語句放到任何地方。前者對我來說似乎是更好的風格。

0

如果你不包含它,那麼試圖使用你的圖書館的人是一種痛苦。如果從C++應用程序中使用C頭文件而沒有用戶將得到編譯器或鏈接器錯誤,這對於不熟悉該問題的人可能會特別困惑。

2

這樣做的結果是,它允許您將C頭文件與您的C++代碼一起使用,因爲將定義宏"__cplusplus"。但是,您仍然可以將其與遺留的C代碼一起使用,因爲它沒有定義宏,所以它不會看到獨特的C++構造。

#ifdef __cplusplus 
extern "C" { 
#endif 

// all of your legacy C code here 

#ifdef __cplusplus 
} 
#endif 

另一種方法是把它與#include,但如果你在C頭文件做到這一點,那麼你只需要做一次,再加上它的向後兼容。

相關問題