使用 libc++ 和 libstdc++ 的 void* 类型的字符串流行为差异

2023-11-27

以下测试程序返回不同的结果,具体取决于我使用的是 libc++ 还是 libstdc++。

#include <sstream>
#include <iostream>

int main()
{
    int a = 0;
    void* optr = &a;
    void* iptr;

    std::stringstream ss;
    ss << optr;
    std::cout << ss.str() << '\n';

    ss >> iptr;
    std::cout << iptr << '\n';

    return 0;
}

我在 OSX 10.9.2 上使用来自 Xcode 5 的以下版本的 clang

$ xcrun clang++ --version              
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix

这是使用 libstdc++ 和 libc++ 构建时的测试输出

$ xcrun clang++ test.cpp  <-- libstdc++ version             
$ ./a.out
0x7fff5ec723e8
0x7fff5ec723e8
$ xcrun clang++ test.cpp -stdlib=libc++  <-- libc++ version
$ ./a.out
0x7fff5205125c
0x7fff5

这是 stringstream 的 libc++ 实现中的错误吗? void* 与 stringstream 的这种用法在 C++ 中有效吗?

Thanks!


是的!这是 libc++ 中的一个错误,可能是在实现中__sscanf_l (some scanf看起来很相似,应该考虑区域设置)。 libstdc++ 的实现要简单得多。

// libc++

template <class _CharT, class _InputIterator>
_InputIterator
num_get<_CharT, _InputIterator>::do_get(iter_type __b, iter_type __e,
                                        ios_base& __iob,
                                        ios_base::iostate& __err,
                                        void*& __v) const
{
    // Stage 1
    int __base = 16;
    // Stage 2
    char_type __atoms[26];
    char_type __thousands_sep = 0;
    string __grouping;
    use_facet<ctype<_CharT> >(__iob.getloc()).widen(__num_get_base::__src,
                                                    __num_get_base::__src + 26, __atoms);
    string __buf;
    __buf.resize(__buf.capacity());
    char* __a = &__buf[0];
    char* __a_end = __a;
    unsigned __g[__num_get_base::__num_get_buf_sz];
    unsigned* __g_end = __g;
    unsigned __dc = 0;
    for (; __b != __e; ++__b)
    {
        if (__a_end == __a + __buf.size())
        {
            size_t __tmp = __buf.size();
            __buf.resize(2*__buf.size());
            __buf.resize(__buf.capacity());
            __a = &__buf[0];
            __a_end = __a + __tmp;
        }
        if (this->__stage2_int_loop(*__b, __base, __a, __a_end, __dc,
                                    __thousands_sep, __grouping,
                                    __g, __g_end, __atoms))
            break;
    }
    // Stage 3
    __a[sizeof(__a)-1] = 0;
#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
    if (sscanf_l(__a, _LIBCPP_GET_C_LOCALE, "%p", &__v) != 1)
#else
    if (__sscanf_l(__a, __cloc(), "%p", &__v) != 1)
#endif
        __err = ios_base::failbit;
    // EOF checked
    if (__b == __e)
        __err |= ios_base::eofbit;
    return __b;
}

versus

// libstdc++

template<typename _CharT, typename _InIter>
_InIter
num_get<_CharT, _InIter>::
do_get(iter_type __beg, iter_type __end, ios_base& __io,
       ios_base::iostate& __err, void*& __v) const
{
  // Prepare for hex formatted input.
  typedef ios_base::fmtflags        fmtflags;
  const fmtflags __fmt = __io.flags();
  __io.flags((__fmt & ~ios_base::basefield) | ios_base::hex);

  typedef __gnu_cxx::__conditional_type<(sizeof(void*)
                     <= sizeof(unsigned long)),
unsigned long, unsigned long long>::__type _UIntPtrType;       

  _UIntPtrType __ul;
  __beg = _M_extract_int(__beg, __end, __io, __err, __ul);

  // Reset from hex formatted input.
  __io.flags(__fmt);

  __v = reinterpret_cast<void*>(__ul);
  return __beg;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 libc++ 和 libstdc++ 的 void* 类型的字符串流行为差异 的相关文章

随机推荐

  • AngularJS $httpProvider 未定义

    我正在尝试使用拦截器的基本示例 因此我盯着一小段代码但没有成功 var app angular module app config routeProvider locationProvider function routeProvider
  • 单击 jquery 按钮 + 发送不带表单的数据 - 书签

    我正在开发一个书签功能 用户单击 jQueryui 按钮 某些信息就会发送到数据库 但我没有使用表单 因为没有任何信息供用户输入 我从会话数据中提取用户的 ID 然后发送 URI 段 URL 的一部分 使用 codeigniter php
  • 变量引用不存在的资源Build.xml

    我正在使用 Eclipse Kepler 并且正在尝试执行我的构建脚本 当我运行任务时 我收到 Ant 错误 变量引用不存在的资源 workspace loc MyProject JAVA dev new build xml 问题是这条路是
  • LINQ to XML:应用 XPath

    有人能告诉我为什么这个程序没有枚举任何项目吗 它与 RDF 命名空间有关系吗 using System using System Xml Linq using System Xml XPath class Program static vo
  • Rails:如何从http下载文件并将其保存到数据库中

    我想创建一个 Rails 控制器 从网络下载一系列 jpg 文件并将它们直接以二进制形式写入数据库 我不想做上传表单 有什么线索可以做到这一点吗 谢谢 编辑 这是我已经使用 Attachment fu gem 编写的一些代码 http Ne
  • Reactjs 中的简单条件路由

    如何实现条件路由 即当且仅当满足某些条件时 才应该发生路由 例如 当且仅当用户输入正确的凭据时 登录才应该成功 并且用户应该能够看到欢迎页面 如果我们直接点击某个 URL 例如localhost 8080 welcome 不应导航至欢迎页面
  • 是否可以确定使用 Object.create 创建的对象是否继承自 JavaScript 中的 Array?

    识别哪些对象是哪些对象很复杂在 JavaScript 中 找出哪些对象是数组有一定的难度黑客解决方案 幸运的是 它能够在以下两种情况下工作 Object prototype toString call object Array Object
  • 获取本周的时间戳

    我有一个当天的日期时间 我需要获取本周开始和结束的两个 UNIX 时间戳 如何使用 dateperiod 或 dateinterval 类 now time beginning of week strtotime last Monday n
  • 如何通过pjax进行github风格的页面转换

    有一次看到一篇文章说github页面转场是pjax做的 我查了一下jquery pjax项目 我想我已经接近答案了 这一定与事件有关pjax start and pjax end 但我仍然无法让它发挥作用 所以我尝试在这里寻求一些帮助 a
  • FFMPEG:解码视频时,是否可以将结果生成到用户提供的缓冲区?

    在ffmpeg解码视频场景中 H264例如 通常我们分配一个AVFrame并对压缩后的数据进行解码 然后我们从成员中得到结果data and linesize of AVFrame 如下代码 input setting data and s
  • Bootstrap 3 上的输入宽度

    再次更新 我通过选择最佳答案来结束这个问题 以防止人们在没有真正理解问题的情况下添加答案 事实上 如果不使用网格或添加额外的 CSS 就无法通过内置功能来实现这一点 如果您正在处理以下问题 网格将无法正常工作help block例如 需要超
  • 快速将计算数据传递回先前的视图控制器

    我正在创建我的第一个简单的预算应用程序 基本上 我会收集一些用户输入 例如月收入和储蓄目标 然后他们单击 开始 应用程序会计算他们的每日预算等内容 我在这里遇到了麻烦 完成所有计算后 我显示 您每天可以花多少钱 例如每天 20 美元 我将其
  • R闪亮的绝对面板隐藏在传单输出后面

    我正在尝试使传单地图全屏显示 并在地图顶部添加过滤器控件 但是 当我尝试执行此操作时 我的过滤器控件 绝对面板 在运行时隐藏在传单输出后面 当我手动给出宽度时 存在绝对面板 我希望地图是全屏的 当我这样做时 它隐藏在地图后面 如何使地图位于
  • Mongodb:“com.mongodb.MongoSocketReadException:与吗啡提前到达流末尾”

    我有一个简单的数据结构 Transaction如下引用 插入到 mongodb 中 amount 111 debitAcc 588188286231743e7d5c923d type CHARGE 我得到以下错误堆栈 com mongodb
  • Webkit 文本不透明度过渡问题

    情况 查看 jsFiddle 里面一个div我有一个图像 后面跟着一个文本 其中有一个font weight900 就可以了 在我的本地托管环境中 我使用自定义字体 但对于上面的小提琴 我选择了 非常时尚 的 Comic Sans 来说明我
  • 每个提供的属性带有“OR”子句的通用表达式树

    我为 IQueryable 创建了一个通用搜索扩展方法 使您能够搜索单个属性以查看其中是否包含搜索词 http jnye co Posts 6 c 23 generic search extension method for iquerya
  • CSS 在 Web 服务器上的呈现方式与在开发环境上的呈现方式不同

    我遇到这样的问题 我在开发环境中创建的 Web 应用程序在上传到 Web 服务器后显示有所不同 我使用相同的浏览器和同一台机器来查看页面 唯一不同的是 服务器 我使用的是 net 3 5 在我的开发环境中 页面是使用 ASP net 开发服
  • 在子视图上绘制矩形?

    我创建了一个容器视图 其中包含一堆子视图 一个集合视图 一个自定义工具栏和一些零碎的内容 该设计在顶部 左侧和右侧有边框 但底部没有 因此我重写了drawRect以包含边框 当我添加工具栏时 我注意到它出现在边框的顶部 出于某种原因 我最初
  • 如何将 System.Drawing.font 转换为 System.Windows.Media.Fonts 或 TypeFace?

    我怎样才能转换System Drawing Font to a System Windows Media Fonts or TypeFace 或者我如何生成一个实例System Windows Media Fonts or TypeFace
  • 使用 libc++ 和 libstdc++ 的 void* 类型的字符串流行为差异

    以下测试程序返回不同的结果 具体取决于我使用的是 libc 还是 libstdc include