c++ - C 迁移到 C++(嵌入式)

标签 c++ embedded migrating

我在纯 C 中有一个项目 - st usb 库,我需要将它迁移到 C++ 并将相同的结构更改为类。我删除了所有 C++“保护”,例如:

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

我将所有文件扩展名从 .c 更改为 .cpp(HAL 库除外)。 我意识到 c++ .hex 比 c .hex 小 7kB。当我查看 .map 文件时,我发现缺少许多功能。我认为是 static 函数导致的,但删除 static 关键字没有帮助。有谁知道可能导致某些函数未编译的原因。当扩展名是 .c 时,一切都很好。

最佳答案

我能想到两个主要原因:

  1. 内联。如果所有用法都可以内联,编译器可以决定不需要将函数作为独立函数发出。
  2. 未使用的代码。编译器可以看到代码中的任何地方都没有使用某个函数,并决定将其从最终结果中删除。

如果结果要用作某种库,即您的环境调用特定函数而无需在您自己的代码中显式调用,我认为最好的方法是将您的代码编译并链接为库(可能是动态库) 并将这些函数导出为库接口(interface)(在 gcc 中可见,在 MSVC 中 dllexport)将强制编译器/链接器将它们包含在生成的二进制文件中,即使它们现在不明白为什么需要它们。 (当然,这是对您的目标环境的大胆猜测。)

另一种选择是关闭特定的编译器/链接器优化,以删除死代码并强制为内联函数发出独立函数实例,但我认为这是非常间接的方法,具有更广泛的影响,并且会使以后的维护复杂化。

关于c++ - C 迁移到 C++(嵌入式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38912992/

相关文章:

c - 将输入值存储在结构中以便稍后进行最快的比较

visual-studio-2017 - 将 Visual Studio 2019 降级回 Visual Studio 2017

postgresql - 尝试将简单执行存储过程转换为 postgres 函数 - 无法使 CURRVAL ('table_seq' ) 运行

c++ - 非标准语法 - 使用 & 创建指向成员 : C++ function pointer to member 的指针

c++ - 如何在一些类之间共享不同的对象

embedded - ST32 上的 FATFS,设备配置为 USB 驱动器

Delphi:从 IBO 迁移到 FireDac

c++ - 检测具有范围的 vector 数组中的弧形和圆形

c++ - 如何在 C++ 中查找程序的类名和标题?

c - 链接描述文件生成器