2

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

std::cout << 1.2;

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

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

4

1 回答 1

2

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

使用此代码:

std::cout << 1.2f;

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

  1. 运算符<<(float _Val) (std::basic_ostream<_Elem, _Traits>)
    1. 将状态变量初始化为good
    2. 调用use_facet<_Facet>(const locale & _Loc) (std) 以获取 num_put facet。
    3. 调用num_put(_OutIt _Dest, ios_base& _Iosbase, _Elem _Fill, double _Val) (std) 以使用本地特定格式将浮点数写入输出流(转换为双精度)。在内部,这是:
      1. 检查精度,例如固定,以查看默认格式是否已被修改。
      2. 格式化数字并将其作为字符写入流使用的当前迭代器的输出。
    4. 如果操作失败,则将状态变量设置为bad 。
    5. 调用setstate到状态。

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

于 2012-10-02T23:28:47.683 回答