2013-12-10 114 views
0

我目前正在研究stm32f3的嵌入式項目。在這個項目中,我想同時使用.cpp.c文件: C文件用於UART/I2C ...初始化文件,而C++文件用於更加面向對象的解決方案。所以我真的需要保持他們兩個。 我的問題是如何使它正常工作?我在網上看到了一些答案,但對我來說這一切似乎都很困惑。如何正確啓動C和C++ IAR嵌入式項目?

我已經有一個C++項目中的uart.c/h文件(該板工作正常)的項目,但是當我向該項目添加i2c.c/h文件時,出現了很多鏈接錯誤。

示例= Error[Li005]: no definition for "I2C_StructInit" [referenced from C:\Users\IAR Embedded Workbench\STM32F3-Discovery_FW_V1.1.0\Project\I2C Interface CPU\Debug\Obj\i2c.o]

如若main是C或C++文件?

我應該在項目設置中使用Language\Auto,還是爲每個要在C或C++中編譯的文件指定?

我什麼時候需要使用extern "C"

我正在使用IAR Embedded Workbench IDE。 歡迎任何其他建議。

回答

3

我不熟悉這個平臺,但問題聽起來很一般。

main應該是C還是C++文件?

C++將是更安全的選擇,因爲main涉及到程序初始化和C++實現動態初始化不像C.

什麼時候需要使用extern "C"

這很重要,並且可能是您的問題的來源。您需要extern "C"裝飾在C中每聲明++,其定義在C.

如果你的C頭文件缺少extern "C"提供,你可以在緊要關頭將其添加爲他們:

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

把一個#include指令內任何東西通常都是一個非常糟糕的主意,但這是相對無害的,因爲extern "C" {}不會引入新的嵌套聲明範圍,除了修改包含在其中的聲明的鏈接。

正如我的建議,你也可以在C++模式編譯時修改頭文件以包含extern "C"。我的建議是基於修改圖書館是更大的罪惡的想法。根據我的經驗,可以爲平臺動態生成嵌入式驅動程序,或者在任何情況下,您可能會稍後移動到略有不同的平臺。你應該在這個答案中使用你自己的標題,但我個人會避免編輯i2c.h不惜一切代價。

2

關於IAR具體的東西:

Language\Auto使編譯器確定語言從文件擴展名.c/.cpp。請注意,儘管IAR(至少5.4)僅支持C++的子集,但並非所有功能都可用。

對於其他所有問題:請參閱Potatoswatters關於externmain的回答。

+0

因此我應該使用'language \ C++'嗎? –

+1

@AntoineAndrieu不,如果你使用兩種語言,那麼將它放在'Auto'上並使用正確的文件擴展名來選擇文件的語言。 – user694733

3

在您的.h文件,你應該這樣寫:

#ifdef __cplusplus 
extern "C" { 
#endif 

xxxxx // Your header file content 

#ifdef __cplusplus 
} 
#endif 

那麼您可以在這兩個的.c和.cpp代碼,這樣.h文件沒有問題。

注意竅門是,所有這些函數都沒有C++裝飾,所以c和C++都看到相同的函數名稱。

+0

如果我理解正確,我所有的'.h'文件都應該包含在這個框架中嗎?如果我在extern「C」{}'中聲明一個C++函數並不重要? –

+0

@AntoineAndrieu只有C聲明應該進入'extern C'塊。 – user694733

+1

@AntoineAndrieu是的,因爲'#ifdef __cplusplus'確保只有C++看到'extern「C」',所以你可以這樣寫所有的.h文件。 – Mine