Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确启动C和C++;IAR嵌入式项目?_C++_C_Embedded_Iar - Fatal编程技术网

C++ 如何正确启动C和C++;IAR嵌入式项目?

C++ 如何正确启动C和C++;IAR嵌入式项目?,c++,c,embedded,iar,C++,C,Embedded,Iar,我目前正在为stm32f3开发一个嵌入式项目。在这个项目中,我想同时使用.cpp和.c文件: C文件用于UART/I2C。。。初始化文件,而C++的文件则是面向对象的解决方案。所以我真的需要保留这两个。 我的问题是如何使它正常工作?我在网上看到了一些答案,但对我来说似乎都很困惑 我已经有了一个C++项目中的代码> uART.C/H文件(板工作正常),但是当我在项目中添加了一个 I2C.C/H文件时,出现了许多链接错误。 示例=错误[Li005]:没有“I2C_StructInit”的定义[引用自

我目前正在为stm32f3开发一个嵌入式项目。在这个项目中,我想同时使用
.cpp
.c
文件: C文件用于UART/I2C。。。初始化文件,而C++的文件则是面向对象的解决方案。所以我真的需要保留这两个。 我的问题是如何使它正常工作?我在网上看到了一些答案,但对我来说似乎都很困惑

我已经有了一个C++项目中的<>代码> uART.C/H文件(板工作正常),但是当我在项目中添加了一个<代码> I2C.C/H文件时,出现了许多链接错误。 示例=

错误[Li005]:没有“I2C_StructInit”的定义[引用自C:\Users\IAR Embedded Workbench\STM32F3-Discovery_FW_V1.1.0\Project\I2C Interface CPU\Debug\Obj\I2C.o]

<代码>主< <代码>是C还是C++文件?< /p>

我应该在项目设置中使用<代码>语言\Auto/<代码>,还是指定每个文件在C或C++ +< /P>中编译? 何时需要使用外部“C”

我使用的是IAR嵌入式工作台IDE。
欢迎提供任何其他建议。

我不熟悉这个平台,但问题听起来相当普遍

<代码>主< <代码>是C还是C++文件?< /p> <> > C++是安全的选择,因为<> > <代码>与程序初始化有关,C++实现了与C.</P>不同的动态初始化 何时需要使用外部“C”

这很重要,而且可能是你问题的根源。你需要用<代码>外部“C”/CODE来装饰C++中的每个声明,其定义在C.</P>中提供。 如果您的C头缺少外部“C”,您可以在必要时为它们添加它:

extern "C" {
#include "i2c.h"
}
#include
指令放在任何内容中通常是一个非常糟糕的主意,但这相对无害,因为
extern“C”{}
除了修改其中包含的声明链接之外,没有引入新的嵌套声明作用域


如我建议的,在C++模式编译时,还可以修改头文件包含<代码>外部“C”< /代码>。我的建议是基于这样一种观点,即修改图书馆是更大的罪恶。根据我的经验,嵌入式驱动程序可能是为平台动态生成的,或者在任何情况下,您可能稍后会移动到稍微不同的平台。你应该在回答中使用这个成语作为你自己的标题,但就我个人而言,我会不惜一切代价避免编辑i2c.h

Language\Auto
使编译器根据文件扩展名
.c/.cpp
确定语言。请注意,IAR(至少5.4)只支持C++的子集,并且并非所有的特征都可用。
对于您提出的所有其他问题:请参见PotatosWaters对.h文件中的
extern
main
的回答,您可能应该这样写:

#ifdef __cplusplus
extern "C" {
#endif

xxxxx // Your header file content

#ifdef __cplusplus
}
#endif
然后可以在.c和.cpp代码中包含这样的.h文件,而不会出现问题


注意,技巧是,所有这些函数都没有C++修饰,所以C++和C++都看到了相同的函数名。

我应该使用<代码>语言> C++ >代码>?然后将其保持在
Auto
状态,并使用正确的文件扩展名为文件选择语言。如果我理解正确,则所有
.h
文件都应包含在此框架中,对吗?在C++中,如果我声明C++函数,不管是在c>外部“C”{} /代码>?@ ANToNANDANEURE,只有C声明应该进入“代码>外部C < /COD>块”。