【发布时间】:2014-07-14 05:40:01
【问题描述】:
在 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, ...)。
有什么可以帮助我的宏技巧吗?还是我最好使用显式参数并习惯冗余?
【问题讨论】:
-
天哪,你肯定是在错误的方向迁移。具体来说,您需要使用 VC++ 6 的原因是什么?也许它可以在仍然使用现代编译器的同时解决?
-
@CodyGray。我的教授喜欢 VC++6.0。他认为它轻巧小巧,而 VS2010 显得过于笨重。所以我必须在提交时迁移我的代码。我会努力说服他的,但是他这个年纪的人容易固执。
-
从命令行运行
cl.exe更加轻量和小巧。他根本不需要在 IDE 中打开您的代码!说真的,你的论点不应该是你更喜欢使用任何特定的开发环境。像大多数 C++ 开发人员一样,我也喜欢 VC++6 环境。问题以及您需要提出的论点是,它所捆绑的编译器实在太老了,无法教您有用的现代 C++ 实践。 -
@CodyGray。谢谢。这个论点更有说服力,我想和我的教授分享。无论如何,我仍然很好奇是否有可能在 VC++6 中解决这个问题。
标签: c visual-c++ c-preprocessor visual-c++-6 variadic-macros