2012-02-25 44 views
1

我通常不會這樣做,但我目前正在處理的項目需要一些c源文件中的函數。C在C++的做法

extern "C" { 
    int words(char sentence[]); 
    int match(char str[], char sentence[], int n); 
} 

我只是想知道,哪裏是將這些原型添加到鏈接函數的最佳位置?

它應該被添加到C++源文件(在我的情況下,command.cpp),或c/C++頭? (command.h)

+0

有時C源代碼編譯C++編譯器沒有太多的擺弄(我假設這兩個功能問題不是太長)。這是值得一試的。否則,下面使用這些宏的答案將起作用。 – 2012-02-25 20:39:21

回答

5

的最不容易出錯的辦法是把聲明在一個共享的C & C++頭文件,和#ifdefextern "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宏的前面加上前綴。

1

那麼,因爲它們是函數原型聲明相同的標準在C++申請。您應該將它們添加到頭文件。除非我完全誤解你的問題。

3

標準習慣用法是爲您的頭文件使用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++編譯單元。

+0

源文件不帶有頭文件,不幸的是(我也不能做一個)。 – TheAJ 2012-02-25 20:39:54

+1

你怎麼可能「不被允許做一個」?什麼樣的奇怪的編程問題不會「允許」你做某些編程? – 2012-02-25 20:41:48

+0

你告訴我,這些是我的教授的指示。 基本上,我們必須將我們之前作業中用C寫成的一些函數加入到新的作業中。我們不允許編輯/更改任何內容,但只能包含C文件(wordutils.c)。 – TheAJ 2012-02-25 20:47:41

1

我會把它們放在cpp文件中,在通常放置前向聲明的地方。 如果您在多個cpp文件中使用它們,請考慮標題。只有這樣。

+1

這樣可以很好地工作,但是我個人發現,如果我必須在2個地方更新一些東西,我可能會忘記在其中一個地方這樣做。如果您在定義中更改函數的簽名,但不在標題中,則將聲明放在標題中將導致編譯錯誤。在這種情況下保持它們分離不會引發任何編譯或鏈接錯誤,您只會得到奇怪的運行時效果。歡迎比我更聰明或者比我更不健忘的人忽視這個建議。 :) – pmdj 2012-02-25 20:39:01

0

當然,在頭文件將是一個加號! 但ifdef應該用來避免多重定義。但在你的情況下,這不是問題。