我通常不會這樣做,但我目前正在處理的項目需要一些c源文件中的函數。C在C++的做法
extern "C" {
int words(char sentence[]);
int match(char str[], char sentence[], int n);
}
我只是想知道,哪裏是將這些原型添加到鏈接函數的最佳位置?
它應該被添加到C++源文件(在我的情況下,command.cpp),或c/C++頭? (command.h)
我通常不會這樣做,但我目前正在處理的項目需要一些c源文件中的函數。C在C++的做法
extern "C" {
int words(char sentence[]);
int match(char str[], char sentence[], int n);
}
我只是想知道,哪裏是將這些原型添加到鏈接函數的最佳位置?
它應該被添加到C++源文件(在我的情況下,command.cpp),或c/C++頭? (command.h)
的最不容易出錯的辦法是把聲明在一個共享的C & C++頭文件,和#ifdef
的extern "C" {
僅由C++編譯器被使用(它是在C語言的語法錯誤):
#ifdef __cplusplus
extern "C" {
#endif
int words(char sentence[]);
int match(char str[], char sentence[], int n);
#ifdef __cplusplus
}
#endif
我個人也很喜歡這個變體預先#的定義無範圍extern
語法宏:
#ifdef __cplusplus
#define CFUN extern "C"
#else
#define CFUN
#endif
CFUN int words(char sentence[]);
CFUN int match(char str[], char sentence[], int n);
這樣可以使局部的凌亂的#ifdef東西。您可以將其放置在您的項目範圍頭文件之一中,並在任何地方使用說明符CFUN
。如果可能與現有定義相沖突,您可能需要在CFUN
宏的前面加上前綴。
那麼,因爲它們是函數原型聲明相同的標準在C++申請。您應該將它們添加到頭文件。除非我完全誤解你的問題。
標準習慣用法是爲您的頭文件使用C++定義的__cplusplus
宏。所以,如果你的C編譯單元在file.c
實施,那麼你會寫出如下頭file.h
:
#ifndef H_FILE
#define H_FILE
#ifdef __cplusplus
extern "C" {
#endif
int words(char sentence[]);
int match(char str[], char sentence[], int n);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // include guard
現在你可以使用相同的頭都在C和C++編譯單元。
我會把它們放在cpp文件中,在通常放置前向聲明的地方。 如果您在多個cpp文件中使用它們,請考慮標題。只有這樣。
這樣可以很好地工作,但是我個人發現,如果我必須在2個地方更新一些東西,我可能會忘記在其中一個地方這樣做。如果您在定義中更改函數的簽名,但不在標題中,則將聲明放在標題中將導致編譯錯誤。在這種情況下保持它們分離不會引發任何編譯或鏈接錯誤,您只會得到奇怪的運行時效果。歡迎比我更聰明或者比我更不健忘的人忽視這個建議。 :) – pmdj 2012-02-25 20:39:01
當然,在頭文件將是一個加號! 但ifdef應該用來避免多重定義。但在你的情況下,這不是問題。
有時C源代碼編譯C++編譯器沒有太多的擺弄(我假設這兩個功能問題不是太長)。這是值得一試的。否則,下面使用這些宏的答案將起作用。 – 2012-02-25 20:39:21