C++ 输出流浮点调用链

标签 c++ iostream

在 C++ 中,当我这样做时

std::cout << 1.2;

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

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

最佳答案

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

使用此代码:

std::cout << 1.2f;

...以下是 Visual Studio 2012 中没有噪音的情况:

  1. operator<<(float _Val) (std::basic_ostream<_Elem, _Traits>)
    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) 使用本地特定格式将浮点写入输出流(转换为 double )。在内部,这个:
      1. 检查 precision ,这样fixed ,查看默认格式是否已修改。
      2. 格式化数字并将其作为流使用的当前迭代器的字符写入输出。
    4. 将状态变量设置为 bad如果操作失败。
    5. 调用 setstate给国家。

因此,大部分工作实际上是在 num_put 方面完成的,该方面写入输出流的迭代器。

关于C++ 输出流浮点调用链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12699876/

相关文章:

c++ - 相机校准和坐标转换(OpenCV)

c++ - 我们如何使用动态规划解决子串匹配检查

c++ - 如何将 float 转换为字符串

python : communication with c++ command line program not working when using <cstdio>

C++ 类重新定义错误 - 帮助我理解标题和链接

c++ - 是否有围绕 Win32 的无锁 SList 的合适的 C++ 包装器?

c++ - Bjarne Stroustrup 第 10.5 章示例

c++ - 如何使用 C++ 流输出小数点后 3 位数字?

c++ - 我的函数调用中未声明的标识符 (C++)

c++ - 如何在 C++ 中创建处理输入和输出的流?