私は人々がこれまでに提案したものよりも過激になりますが、多分それはあなたにとって多すぎます。('inline'キーワードはC99です。C89にコーディングすれば、それほど大きな影響を与えることなく省略できます。)
/*
** These could be omitted - unless you get still more radical and create
** the format strings at run-time, so you can adapt the %-24s to the
** longest tag you actually have. Plus, with the strings all here, when
** you change the length from 24 to 30, you are less likely to overlook one!
*/
static const char fmt_int[] = "%-24s [%d]\n";
static const char fmt_long[] = "%-24s [%ld]\n";
static const char fmt_str[] = "%-24s [%s]\n"; /* Plausible extra ... */
static inline void print_long(FILE *fp, const char *tag, long value)
{
fprintf(fp, fmt_long, tag, value);
}
static inline void print_int(FILE *fp, const char *tag, int value)
{
fprintf(fp, fmt_int, tag, value);
}
static inline void print_str(FILE *fp, const char *tag, const char *value)
{
fprintf(fp, fmt_str, tag, value);
}
static void dump_data(FILE *fp, const serial_info_t *info)
{
dump_long("Starting serial number", info->start_int_idx);
dump_int( "Current Serial number", info->current_int_idx);
/* ... and similar ... */
}
次に、呼び出し元のコードは、オプション1、2、3に対して1dump_data()
回(引数付き)、オプション4に対して2回(1回は、出力ファイル用のファイルポインターを使用して)呼び出します。stdout
stdout
パラメータの数が本当に(数百に)膨大になった場合は、型とオフセットの情報(offsetof
から<stddef.h>
)と関数へのポインタなどをエンコードしたデータ構造を検討することもできます。dump_data()
必要なすべての情報をエンコードする構造体を反復処理するループです。
long
データ構造のすべての整数メンバーに同じ基本整数型(この例では)を使用することで、作業を簡素化することもできます。
「人月の神話」のフレッド・ブルックス-まだ読んでいない場合は読む価値のある本ですが、20周年記念版を必ず読んでください-第9章で次のように述べています。
あなたのフローチャート[コード]を見せて、あなたのテーブル[データ構造]を隠してください、そして私は謎に包まれ続けます。私にあなたのテーブルを見せてください、そして私は通常あなたのフローチャートを必要としません。それらは明らかです。
このコードのテーブル駆動バージョンは、スペースを節約するだけでなく、同じ方法で100の関連する関数を変更しなければならない場合のフラストレーションを節約する可能性がありますが、表形式のデータを変更するだけで全体を修正できた可能性があります。