fprintf格式参数如何?

时间:2017-10-17 08:08:35

标签: c++ c++11

我目前正在尝试将MyType的任意数量的参数传递给fprintf,如下所示:

void myPrint(const char* fmt, std::initializer_list<MyType> args)
{
  fprintf(stdout, fmt, args);
}

其中MyType基本上是一个变体,可以从最常见的类型构造(int,string,uint *,bool,...)。现在这样调用myPrint(...)

myPrint("I am a hex int: %x", { 5 } );

这将始终打印initializer_list的地址。查看参考文献时,例如cplusplus.com,它说

  

[...]如果格式包含格式说明符(以%开头的子序列),则格式为的其他参数将格式化为,并插入到结果字符串中,替换它们各自的说明符。 [...]

microsoft.com

  

[...]每个函数参数(如果有的话)被转换并根据格式的相应格式规范输出。 [...]

所以,我的问题是:fprintf 格式如何转换其参数?它是否使用运营商?它是否使用演员表?

1 个答案:

答案 0 :(得分:1)

fprintf是从C继承的函数。特别是,它采用C variadic参数:int fprintf(FILE*, const char*, ...)

您只能将内置C类型传递给此类函数,甚至不能传递用户定义的C类型。尝试这样做是未定义的行为。尝试传递MyType是危险的(例如,您提及的string是不允许的)。传递std::initializer_list<T> 总是未定义的行为。

正如Jarod在评论中所述,使用std::cout <<。如果您需要更高级的格式,请使用Boost.format