我在纯 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
时,一切都很好。
最佳答案
我能想到两个主要原因:
- 内联。如果所有用法都可以内联,编译器可以决定不需要将函数作为独立函数发出。
- 未使用的代码。编译器可以看到代码中的任何地方都没有使用某个函数,并决定将其从最终结果中删除。
如果结果要用作某种库,即您的环境调用特定函数而无需在您自己的代码中显式调用,我认为最好的方法是将您的代码编译并链接为库(可能是动态库) 并将这些函数导出为库接口(interface)(在 gcc 中可见,在 MSVC 中 dllexport)将强制编译器/链接器将它们包含在生成的二进制文件中,即使它们现在不明白为什么需要它们。 (当然,这是对您的目标环境的大胆猜测。)
另一种选择是关闭特定的编译器/链接器优化,以删除死代码并强制为内联函数发出独立函数实例,但我认为这是非常间接的方法,具有更广泛的影响,并且会使以后的维护复杂化。
关于c++ - C 迁移到 C++(嵌入式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38912992/