在 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 中没有噪音的情况:
- operator<<(float _Val) (std::basic_ostream<_Elem, _Traits>)
- 初始化 state变量为good .
- 调用 use_facet<_Facet>(const locale & _Loc) (std) 获取 num_put 方面。
- 调用 num_put(_OutIt _Dest, ios_base& _Iosbase, _Elem _Fill, double _Val) (std) 使用本地特定格式将浮点写入输出流(转换为 double )。在内部,这个:
- 将状态变量设置为 bad如果操作失败。
- 调用 setstate给国家。
因此,大部分工作实际上是在 num_put 方面完成的,该方面写入输出流的迭代器。
关于C++ 输出流浮点调用链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12699876/