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

C migrating to C++ (embedded)

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

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif

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

我可以想到两个主要原因:

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

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

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

C++ 函数的签名与 C 函数不同。由于您丢失了功能并且代码小得多,因此很可能需要 C 链接的函数被编译为 C++,并且签名不匹配阻止了正确的链接。

发生这种情况的可能位置是在中断向量中 table。如果处理程序函数是使用 C++ 链接编译的,则处理程序地址不会使其成为使用 C 编译的 table。

仔细检查中断向量并确保它们引用了正确的函数。如果它们正确,请检查任何其他使用 C 编译的代码,这些代码可能引用使用 C++ 编译的外部符号。