【问题标题】:How to correctly start a C and C++ IAR embedded project?如何正确启动 C 和 C++ IAR 嵌入式项目?
【发布时间】:2013-12-27 15:00:57
【问题描述】:

我目前正在为 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。 欢迎任何其他建议。

【问题讨论】:

    标签: c++ c embedded iar


    【解决方案1】:

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

    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++ 的子集,并且并非所有功能都可用。

      对于您提出的所有其他问题:请参阅关于 externmain 的 Potatoswatters 回答。

      【讨论】:

      • 因此我应该使用language\C++ 吗?
      • @AntoineAndrieu 不,如果您同时使用这两种语言,请将其保留在 Auto 并使用正确的文件扩展名来选择文件的语言。
      【解决方案3】:

      在您的 .h 文件中,您可能应该这样写:

      #ifdef __cplusplus
      extern "C" {
      #endif
      
      xxxxx // Your header file content
      
      #ifdef __cplusplus
      }
      #endif
      

      然后您可以毫无问题地将此类 .h 文件包含在 .c 和 .cpp 代码中。

      注意诀窍是,所有这些函数都没有 c++ 修饰,所以 c 和 c++ 看到相同的函数名。

      【讨论】:

      • 如果我理解正确,我所有的.h 文件都应该包含在这个框架中,对吗?我在extern "C" {} 中声明一个 C++ 函数没关系?
      • @AntoineAndrieu 只有 C 声明应该放在 extern C 块内。
      • @AntoineAndrieu 是的,因为#ifdef __cplusplus 确保只有c++ 才能看到extern "C",所以你可以这样写所有的.h 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 2011-11-28
      • 1970-01-01
      • 2021-03-30
      • 2013-01-13
      • 2011-09-10
      相关资源
      最近更新 更多