代码之家  ›  专栏  ›  技术社区  ›  PeterK

帮助理解C标准宏(va\u start…)

  •  0
  • PeterK  · 技术社区  · 14 年前

    最近我遇到了这个函数(在logger类中使用)。我理解 是的,但我不知道 怎样 :

    void Reporter::print( const char* szFormat, ...)
    {
        // note: m_out is a FILE*
        va_list args;
        va_start(args, szFormat);
        vfprintf( m_out, szFormat, args);
        va_end(args);
    }
    

    reference ,但我还是不清楚。最让我烦恼的是,这并不像预期的那样有效。最后一个数字是0,字符串是(null),尽管它应该打印一些大于0的数字和文件路径。

    案例1:

    rep.print( "Values: %08X %08X %08X %08X %08X %08X %d %s\n", val1, val2, val3, val4, val5, val6, source.GetLength(), szPath );
    // source.GetLength() returns a size_t, szPath is a const char* and IS indeed a valid string
    

    但换成这个效果很好:

    rep.print( "Values: %08X %08X %08X %08X %08X %08X", val1, val2, val3, val4, val5, val6 );
    rep.print( " %d %s\n", source.GetLength(), szPath );
    

    1 回复  |  直到 14 年前
        1
  •  3
  •   caf    14 年前

    的代码 Reporter::print args 引用变量参数列表,然后将该变量参数列表传递给 vfprintf()

    你的问题很可能是 %d 格式说明符(需要 int source.GetLength() (我冒昧地猜测,这可能是 size_t ). 如果你知道长度总是适合 内景 ,然后可以通过强制转换来解决它:

    ..., (int)source.GetLength(), ...
    

    (这是因为编译器不知道作为变量参数列表一部分的参数的预期类型,这与普通的原型函数声明不同)。