VS2010では、情報をファイルにダンプするために次の可変長マクロを作成しました。
#define INDENT(fp, indent) for(size_t __i = 0; __i < (indent); ++__i) fprintf((fp), " ")
// IND_FP = indented fprintf.
// This macro uses two IMPLICIT parameters.
// 1. (FILE *)fp is a pointer to the output file.
// 2. (size_t)indent specifies the indentation level.
#define IND_FP(format, ...) do{ INDENT(fp, indent); fprintf(fp, format, __VA_ARGS__); }while(0)
これらのマクロは、私のプログラムで頻繁に発生します。
void CMAP::dump_info(FILE *fp, size_t indent){
IND_FP("<cmap tableVersion=\"0x%08x\" numberOfEncodingTables=\"%d\">\n",
table_version_number, num_encoding_tables);
//...
IND_FP("</cmap>\n");
}
悲しいことに、コードをアンティルビアン IDE のVC++6.0に移行する必要がありますが、これは可変個引数マクロをサポートしていません。代わりに可変個引数関数を書きました。
void IND_FP(FILE *fp, size_t indent, char *format, ...){
INDENT(fp, indent);
va_list arg_ptr;
va_start(arg_ptr, format);
vfprintf(fp, format, arg_ptr);
va_end(arg_ptr);
}
しかし、数百行ではないにしても数十行のコードを から に変更する必要がありIND_FP(format, ...)
ますIND_FP(fp, indent, format, ...)
。
私を助けることができるマクロのトリックはありますか? それとも、明示的な引数を使用して冗長性に慣れた方がよいでしょうか?