В 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, ...)
.
Есть ли какой-нибудь трюк с макросом, который может мне помочь? Или мне лучше использовать явные аргументы и привыкнуть к избыточности?
cl.exe
из командной строки еще более легкий и крошечный. Ему вообще не нужно открывать ваш код в IDE! Серьезно, ваш аргумент не должен заключаться в том, что вам больше нравится использовать какую-то конкретную среду разработки. Как и большинству разработчиков C++, мне тоже нравилась среда VC++6. Проблема и аргумент, который вам нужно привести, заключается в том, что компилятор, с которым он связан, буквально слишком стар, чтобы научить вас полезным современным практикам C++. - person Cody Gray   schedule 25.05.2014