我目前正致力于stm32f3的嵌入式项目。在这个项目中,我想使用.cpp
和.c
文件:
C文件用于UART / I2C ...初始化文件,而C ++用于更面向对象的解决方案。因此,我真的需要保留它们。
我的问题是如何让它正常工作?我在网上看到了一些答案,但这对我来说似乎都很混乱。
我已经在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。 欢迎任何其他建议。
答案 0 :(得分: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
。
答案 1 :(得分:3)
在你的.h文件中,你应该这样写:
#ifdef __cplusplus
extern "C" {
#endif
xxxxx // Your header file content
#ifdef __cplusplus
}
#endif
然后你可以在.c和.cpp代码中包含这样的.h文件而没有问题。
注意诀窍是,所有这些函数都没有c ++装饰,所以c和c ++都看到相同的函数名。
答案 2 :(得分:2)
关于IAR特定的东西:
Language\Auto
使编译器从文件扩展名.c/.cpp
中确定语言。请注意,虽然IAR(至少5.4)仅支持C ++的子集,但并非所有功能都可用。
对于您提出的其他问题:请参阅Potatoswatters关于extern
和main
的答案。