printf
組み込みシステム用の HAL を作成していますが、その一部として( というクラスを介して) 機能を再作成しています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.... ああ、それは肥大化し
ていませ ん。しかし、いいえ...代わりに、7,092 kB のコード サイズと、正しく実行されないプログラムがあります。ENABLE_PRINT_FLOAT
最小サイズ:
両方をコンパイルせずにコンパイルする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
}
}