C ++输出流浮点调用链

时间:2012-10-02 23:23:46

标签: c++ iostream

在C ++中,我做的时候

std::cout << 1.2;

实际显示数字的实际函数链是什么?我意识到这是特定于编译器的,但我特别感兴趣的是Gnu libstdc ++实现。

在C中,调用printf委托给vfprintf,它通过跳转表在glibc中调用__printf_fp。我正在寻找纯C ++设置中的类似链。

1 个答案:

答案 0 :(得分:2)

显然,它会首先调用ostream::operator<<,但除此之外它可能是特定于库的。回答这个问题的最好方法是调试代码并在函数发生时跟踪它们。这不仅会告诉您调用哪些函数,还会告诉您有关边缘情况和错误处理的信息。查看代码可能会有所帮助,但可能会令人费解。

使用此代码:

std::cout << 1.2f;

...这里是没有噪音的Visual Studio 2012中的内容:

  1. operator<<(float _Val)(std :: basic_ostream&lt; _Elem,_Traits&gt;)
    1. state变量初始化为good
    2. 调用use_facet<_Facet>(const locale & _Loc)(std)获取num_put方面。
    3. 使用本地特定格式调用num_put(_OutIt _Dest, ios_base& _Iosbase, _Elem _Fill, double _Val)(std)将float写入输出流(转换为double)。在内部,这个:
      1. 检查precision,例如fixed,看看是否修改了默认格式。
      2. 格式化数字并将其作为字符写入输出,并将其写入流使用的当前迭代器。
    4. 如果操作失败,请将状态变量设置为bad
    5. 致电setstate州。
  2. 因此,大部分工作实际上是在num_put facet中完成的,该facet写入输出流的迭代器。