2017-06-01 112 views
0

我只有用C編寫的代碼。主要功能是main.c,它包括其他c文件,如#include "Flash.h"爲什麼我不能在main.cpp中包含C文件?

我想保持項目正常工作,但能夠添加cpp文件。 有人告訴我,我必須要改變的主要是

main.cpp 

時將產生compilation- 250個錯誤對於包括Ç文件

什麼是將主文件CPP的正確方法仍然包含C文件?

main.cpp中:

#include "Flash.h" 
int main(void) 
{ 
.... 
} 

我已閱讀How to use C source files in a C++ project?這並沒有給我提供一個直接的解決問題的方法(我的編譯器將使用C++反正)。

編輯

之前有人會殺了我的要求(不知道爲什麼你這麼激進的),我得到的只有3種錯誤250倍:

'->' cannot appear in a constant-expression 
'&' cannot appear in a constant-expression 
a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 

編輯2: 下面是一些線路(運行使用SDK的某些射頻芯片): 大部分錯誤來自本節

typedef enum /*lint -save -e30 -esym(628,__INTADDR__) */ 
{ 
    NRF_GPIOTE_TASKS_OUT_0  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[0]), /**< Out task 0.*/ 
    NRF_GPIOTE_TASKS_OUT_1  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[1]), /**< Out task 1.*/ 
    NRF_GPIOTE_TASKS_OUT_2  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[2]), /**< Out task 2.*/ 
    NRF_GPIOTE_TASKS_OUT_3  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[3]), /**< Out task 3.*/ 
#if (GPIOTE_CH_NUM > 4) || defined(__SDK_DOXYGEN__) 
    NRF_GPIOTE_TASKS_OUT_4  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[4]), /**< Out task 4.*/ 
    NRF_GPIOTE_TASKS_OUT_5  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[5]), /**< Out task 5.*/ 
    NRF_GPIOTE_TASKS_OUT_6  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[6]), /**< Out task 6.*/ 
    NRF_GPIOTE_TASKS_OUT_7  = offsetof(NRF_GPIOTE_Type, TASKS_OUT[7]), /**< Out task 7.*/ 

在這些線路上同樣的錯誤重複:

a cast to a type other than an integral or enumeration type cannot appear in a constant-expression 
+2

C和C++仍然是兩種截然不同的語言,您不能指望爲C編譯器編寫的頭文件用C++編譯器完美編譯。 –

+1

爲什麼混合使用C和C++?難怪它不會編譯。您必須改用'main.c'。 – Rakete1111

+0

你使用什麼編譯器?有些會根據擴展名(例如'.c' vs'.cpp')自動檢測語言(C vs C++)。它們確實是不同的語言,C語言程序不一定會編譯爲C++語言,因爲語言差異很大。 – CoryKramer

回答

5

C++中的#include指令是文字包含的源代碼。想象一下,在Flash.h C源代碼中包含了由main.c做這樣

typedef int class; 

一些與C++不兼容現在,在main.cpp你有

#include "Flash.h" 

這是完全一樣,如果你直接在C有這個代碼typedef int class; ++源文件 - 所以這是一個錯誤。


如果您有C頭文件的C源代碼,則根本不需要使用C++!

如果您想編寫新的C++代碼並使其調用舊代碼(反之亦然),請使用鏈接器。 C++代碼包含C++頭文件,並分別使用,C代碼包含C頭文件,並且鏈接器將所有代碼組合到可執行文件中。


爲了使您的C和C++部件一起工作,您需要額外的頭文件。例如稱之爲c-cpp-interface.h。然後將其包含在所有的C和C++源文件:

#include "c-cpp-interface.h" // in C files 

extern "C" { 
    #include "c-cpp-interface.h" // in C++ files 
} 

這個文件應該在一個共同的C/C++子集語言編寫。也就是說,主要是C語言,但是具有更高的類型安全性(例如,所有功能的原型必須完全寫入,而不包含暗示的參數...)。

理想情況下,您現有的C頭文件可以這樣使用。但是,C頭文件經常會累積起來,創建新文件比清理現有文件更實用。


看着你(與offsetof)實際的錯誤信息,你應該嘗試有在C儘可能少的代碼儘可能 - C++接口。不要把實現細節(如各種常量的值)放在那裏。只有那些被其他語言調用的函數(C調用C++,反之亦然)的聲明/原型。

+0

如何「分開」?我有一個單一的項目,你能詳細說明如何「分開」做這個嗎?最後我有1個主文件,這個主文件應該使用C和C++,那麼你會怎麼做? – Curnelious

+0

你的項目應該有2個源文件'main.c'和'another.cpp'。我從來沒有使用過C/C++系統,但「項目」的概念在所有系統中都很常見 - 一個項目是源文件的集合。 – anatolyg

+0

所以你有x.c和y.cpp,並且你有一個主文件。你想在main中使用x和y,你會怎麼做?在某些情況下,它們必須相交,因爲它是同一個項目,並且在那一點上,你必須將C包含到C++中,或者相反。 – Curnelious

4

您發表的問題指出,你需要用的inclues

extern "C" { 
#include "cheader.h" 
} 

在你的情況,

extern "C" { 
#include "Flash.h" 
} 
int main(void) 
{ 
} 

並且在每個cpp中wa nts使用C代碼,使用extern "C"四捨五入。

+3

...但是'Flash.h'必須仍然是有效的C++。如果不是,除了「修復」標題外,沒有其他辦法。 'extern「C」'只是關閉/調整名稱混亂;而已。它沒有進入一種「C語言模式」。最終,除非'Flash.h'被設計用於C和C++,否則你不能這樣做。他們是兩種不同的語言。 –

+0

謝謝,剛剛嘗試過,它沒有工作,我有和以前一樣的錯誤。我的main.cpp看起來像我向你展示的,包含少量頭文件,我把它們全部放在extern C中,但它並沒有幫助 – Curnelious

+0

@BoundaryImposition真的嗎?哇,我確實有200個,他們真的很複雜,我不能改變他們,他們中的一些人是司機。那麼我是否永遠堅持使用C? – Curnelious

相關問題