2013-12-10 122 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