2017-05-30 56 views
0

我使用系統工作臺4 stm32(eclipse)。 那裏我有一個混合的C/C++項目,其中C++文件包括C(從來沒有問題)和C文件包括C++文件(很大的麻煩)。eclipse c/C++項目,GCC編譯G ++代碼

我明確地總是爲C++文件定義.cpp/.hpp,爲c文件定義.c/.hpp。另外,如果__cpluplus extern「C」,則任何C文件都已聲明。

但是一個GCC編譯,然後導致一個C++頭(.hpp),然後將編譯與GCC,並告訴我的「未知類型」......但據我所知它應該發生自它的聲明C++(。 HPP)

我怎麼能在這個項目工作:

選項A: 莫名其妙地刪除項目的GCC編譯器和G ++只

問題A1工作:你是怎麼從刪除編譯項目? 問題A2:G ++是相當多挑剔,不會編譯所有,因爲我使用FreeRTOS操作系統的例子做了很多類型轉換的,我的編譯器doesent像所有

選項B:有 嚴格頂級城鎮體系結構,其中允許C++包含c文件,但不能反過來(也不是一個好的選擇,因爲我使用需要做回調/ isr處理的stm32 hal層(c然後我的代碼是C++)

NO OPTION : 使用gcc只有

你怎麼解決這樣的事情? 非常感謝 要去瘋狂在這個:-)

+1

任何包含'#include'sa C++頭文件的源文件*不是C源文件*, 它是一個C++源文件。 (除非C++頭, 和* it *包含的任何文件恰巧只包含C代碼,即它不是真正的C++頭,它實際上是C頭。)所以調用這樣的源文件是沒有意義的'foo.c'。它只能由C++編譯器編譯,因此稱其爲「foo.cpp」。 –

+0

嗨邁克。感謝您的輸入。那麼,基本上,當我有一個嚴格的自頂向下arcitecture(.cpp文件包括.h文件,但.c不允許包括.hpp)我所有的代碼基本上是C++代碼,將完全編譯爲C++? 我不明白,爲什麼我必須在我的eclipse項目中有g ++和gcc編譯器?因爲從構建輸出,gcc用於.c和g ++用於.cpp當我只能使用g ++的所有文件? –

回答

1

一個GCC編譯,然後導致了C++頭(.HPP),然後將 編譯GCC,並告訴我「未知類型的類」 ......但據我 知道,因爲它declaired C++(.HPP)

可以包括任何一個.c.cpp文件本不應該發生,它會被編譯爲包括文件的一部分,使用相同的語言,彷彿它是它的一部分。以Qt頭文件爲例,它們被命名爲QWidgetQString,根本沒有擴展名。它們又包括qwidget.hqstring.h,它們都不是有效的C文件,其中定義了許多類。我在一個項目我的工作,現在這樣做:

uint8_t foo[] = { 
#include "bar.txt" 
}; 

其中bar.txt只是一個數字的列表。編譯器不介意擴展,或者它本身不是有效的C或C++文件。

您可以使用#ifdef __cplusplus掩蓋結構在C++中不兼容C頭文件,例如

#ifdef __cplusplus 
int foo(int); 
int foo(int, int); 
class example { 
public: 
    example(int); 
    int field; 
}; 
extern "C" { 
#endif 
int bar(int); 
#ifdef __cplusplus 
} 
#endif 

foo()超載,所以它不是在C使用,而不能進入extern "C"塊,因此在#ifdef __cplusplus內宣佈將其從gcc中隱藏起來。類聲明同樣受到保護。bar()可以在一個.cpp文件中定義,然後它可以從C代碼中調用,並且它可以與任何C++結構一起使用,例如類,重載函數等。