我正在为嵌入式系统创建一个 HAL,其中一部分是重新创建printf
功能(通过一个名为 的类Printer
)。因为它是一个嵌入式系统,所以代码空间很重要,我想在默认情况下排除浮点支持printf
,但允许我的 HAL 的用户在逐个项目的基础上包含它,而无需重新编译我的库.
我所有的类都在头文件中内联了它们的方法定义。
printer.h
看起来像......
class Printer {
public:
Printer (const PrintCapable *printCapable)
: m_printCapable(printCapable) {}
void put_char (const char c) { ... }
#ifdef ENABLE_PRINT_FLOAT
void put_float (const float f) { ... }
#endif
void printf (const char fmt[], ...) {
// Stuffs...
#ifdef ENABLE_PRINT_FLOAT
// Handle floating point support
#endif
}
private:
const PrintCapable *m_printCapable;
}
// Make it very easy for the user of this library to print by defining an instance for them
extern Printer out;
现在,我的理解是这应该很好用。
printer.cpp
很好很简单:
#include <printer.h>
#include <uart/simplexuart.h>
const SimplexUART _g_simplexUart;
const Printer out(&_g_simplexUart);
不必要的代码膨胀:
如果我在没有定义的情况下编译我的库和项目ENABLE_PRINT_FLOAT
,那么代码大小为 9,216 kB。
必要的代码膨胀:
如果我用 编译库和项目ENABLE_PRINT_FLOAT
,代码大小为 9,348 kB。
必要的代码 blo.... 哦,等等,它并不臃肿:如果我用 编译项目而没有
编译库ENABLE_PRINT_FLOAT
,我希望看到与上面相同的内容。但是不...相反,我的代码大小为 7,092 kB,并且程序无法正确执行。
最小大小:
如果我编译都没有编译ENABLE_PRINT_FLOAT
,那么代码大小只有 6,960 kB。
如何实现代码小、类灵活和易于使用的目标?
构建系统是 CMake。完整的项目源代码在这里。
主文件很好很简单:
#include <printer.h>
void main () {
int i = 0;
while (1) {
out.printf("Hello world! %u %05.2f\n", i, i / 10.0);
++i;
delay(250); // 1/4 second delay
}
}