如何在VC ++ 6.0中模仿可变参数宏?

时间:2014-05-25 08:14:48

标签: c visual-c++ c-preprocessor vc6 variadic-macros

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");
}

可悲的是,现在我必须将我的代码迁移到anvediluvian IDE, VC ++ 6.0 NOT 支持可变参数宏。我写了一个可变函数。

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, ...)的数十行甚至数百行。

是否有任何宏可以帮助我的技巧?或者我最好使用显式参数并习惯冗余?

3 个答案:

答案 0 :(得分:1)

#define IND_FP Logger(indent)

class Logger {
  public:
    Logger(int indent);
    int operator()(FILE* fp, char* format, ...);
  private:
    // an exercise for the reader
};

答案 1 :(得分:0)

你可以通过不使用它们获得圆形变量。使用ofstream而不是FILE *。像这样的东西

#define LOGGER(logfile,loginfo)  logfile << loginfo << std::endl

说你已经声明了一个名为logfile的ofstream。对于简单的事情,您可以使用

LOGGER(logfile, x);

如果您希望变得更复杂,可以使用

LOGGER(logfile, "x = " << x << "  b=" << b);

对于缩进,您可以使用全局

// declaration
char spaces[128];
...
// Initialization
memset(spaces, ' ', sizeof(spaces));

#define LOGGER(logfile,indent,loginfo) \
    spaces[indent] = '\0'; \
    logfile << spaces << loginfo << std::endl; \
    spaces[indent] = ' '

所以以同样的方式,如果你想缩进3

LOGGER(logfile, 3, "x=" << x << "   y=" << y << "   z=" << z);

C ++&lt;&lt;不像printf那样优雅,但它可以解决使用可变参数的问题。

答案 2 :(得分:0)

FILE *g_fp;
size_t g_indent;

void ind_fp(char *format, ...){
  INDENT(g_fp, g_indent);
  va_list arg_ptr;
  va_start(arg_ptr, format);
  vfprintf(g_fp, format, arg_ptr);
  va_end(arg_ptr);
}

#define IND_FP (g_fp = fp, g_indent = indent, &ind_fp)

这可能适用于您的情况。