libc++ 和 libstdc++ 之间的 istream eof 差异

2023-12-23

当链接到 libstdc++ 和 libc++ 时,以下(玩具)程序返回不同的内容。这是 libc++ 中的错误还是我不明白 istream eof() 的工作原理?我尝试在 linux 和 mac os x 上使用 g++ 运行它,在 mac os x 上使用 clang 运行它,无论是否带有 -std=c++0x。我的印象是 eof() 不会返回 true,直到尝试读取(通过 get() 或其他方式)实际上失败。这是 libstdc++ 的行为方式,但不是 libc++ 的行为方式。

#include <iostream>
#include <sstream>

int main() {
    std::stringstream s;

    s << "a";

    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;
    std::cout << "get: " << s.get() << std::endl;
    std::cout << "EOF? " << (s.eof() ? "T" : "F") << std::endl;

return 0;
}

Thor:~$ g++ test.cpp
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libstdc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? F
Thor:~$ clang++ -std=c++0x -stdlib=libc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? T
Thor:~$ clang++ -stdlib=libc++ test.cpp 
Thor:~$ ./a.out
EOF? F
get: 97
EOF? T

EDIT:这是由于旧版本的 libc++ 解释 C++ 标准的方式造成的。对此解释进行了讨论LWG 2036 期 http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#2036,被判定为不正确,并更改了 libc++。

当前的 libc++ 在测试中给出的结果与 libstdc++ 相同。

旧答案:

你的理解是正确的。

istream::get()执行以下操作:

  1. Calls good(),并设置failbit如果它返回 false(这会向设置了其他位的流添加一个故障位),(§27.7.2.1.2[istream::sentry]/2)
  2. 如有必要,刷新任何绑定的东西
  3. If good()此时为 false,返回 eof 且不执行任何其他操作。
  4. 提取一个字符as if通过致电rdbuf()->sbumpc() or rdbuf()->sgetc() (§27.7.2.1[istream]/2)
  5. If sbumpc() or sgetc()返回eof,集合eofbit. (§27.7.2.1[istream]/3) and failbit (§27.7.2.2.3[istream.unformatted]/4)
  6. 如果抛出异常,则设置 badbit (§27.7.2.2.3[istream.unformatted]/1) 并在允许的情况下重新抛出。
  7. 更新 gcount 并返回字符(如果无法获取则返回 eof)。

(引用自 C++11 的章节,但 C++03 在第 §27.6.* 下具有所有相同的规则)

现在我们来看看具体的实现:

libc++(当前 svn 版本)将 get() 的相关部分定义为

sentry __s(*this, true);
if (__s)
{
    __r = this->rdbuf()->sbumpc();
    if (traits_type::eq_int_type(__r, traits_type::eof()))
       this->setstate(ios_base::failbit | ios_base::eofbit);
    else
        __gc_ = 1;
}

libstdc++(随 gcc 4.6.2 一起提供)定义了与

sentry __cerb(*this, true);
if (__cerb)
  {
    __try
      {
        __c = this->rdbuf()->sbumpc();
        // 27.6.1.1 paragraph 3
        if (!traits_type::eq_int_type(__c, __eof))
          _M_gcount = 1;
        else
          __err |= ios_base::eofbit;
      }
[...]
if (!_M_gcount)
  __err |= ios_base::failbit;

如您所见,两个库都调用sbumpc()并设置 eofbit 当且仅当 sbumpc() 返回 eof 时。

您的测试用例使用两个库的最新版本为我生成相同的输出。

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

libc++ 和 libstdc++ 之间的 istream eof 差异 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • 从成员函数指针类型生成函子

    我正在尝试简化 通过make fn 预处理参数的函子的生成 通过wrap 对于 arity 的成员函数n 生成函子基本上可以工作 但到目前为止只能通过显式指定成员函数的参数类型来实现 现在我想从它处理的成员函数类型生成正确的函子 struc
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 如何随着分辨率的变化自动调整大小和调整表单控件

    我注意到某些应用程序会更改控件的位置以尽可能适应当前的分辨率 例如 如果窗口最大化 则控件的设置方式应使整个 GUI 看起来平衡 是否可以使用 C 在 Visual studio 2010 中制作或实现此功能 Use Dock http m
  • tabcontrol selectedindex 更改事件未被触发 C#

    嘿伙计们 我有一个很小的问题 请参阅下面的代码 this is main load private void Form1 Load object sender EventArgs e tabAddRemoveOperator Selecte
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque

随机推荐

  • 如何在极坐标中绘制颤动图

    如何在极坐标中绘制颤动图 我有 r 和 theta 方面的数据 我试过了 import numpy as np radii np linspace 0 5 1 10 thetas np linspace 0 2 np pi 20 theta
  • 如何在 TypeScript 中正确导出和导入模块

    Note 我知道有很多关于这个主题的帖子 而且我已经审阅了很多帖子但没有成功 请参阅本文底部的参考资料 我正在尝试使用 Visual Studio Code 在 TypeScript 中运行一个非常简单的测试 其中我在一个文件中声明一个类并
  • 谷歌地方 api 自动完成 - 添加点击事件

    我正在附加一个搜索结果到 google place javascript api 自动完成 到目前为止我正在这样做 var autocomplete function initialize var myLatlng new google m
  • 如何检测“保存/打开/取消”对话框中单击了哪个按钮?

    我有一个网页 会员可以在其中下载不同类型的文件 我不想获取有关每个成员下载了哪些文件以及下载次数的信息 当用户想要下载文件时 他会弹出浏览器 其中有 3 个选择 打开 保存 和 取消 浏览器中的文件对话框 我只想在单击打开 保存按钮时更新下
  • C 中的变量存储在内存的什么位置?

    考虑到内存分为四段 数据段 堆段 堆栈段和代码段 其中分别有全局变量 静态变量 常量数据类型 局部变量 在函数中定义和声明 变量 在主函数中 指针 并且动态分配的空间 使用 malloc 和 calloc 存储在内存中 我认为他们的分配方式
  • QDialog 未从主窗口打开(pyQt)

    我试图通过单击主窗口中的按钮来启动一个对话框 这是我修改的 qtdesigner 生成的 代码只是为了测试它 我已经设置了 showDial 函数以在单击按钮时显示拨号盘 但它不起作用 from PyQt4 import QtCore Qt
  • erlang 是否以任何巧妙的方式实现记录复制和修改?

    given record foo a b c 我做了这样的事情 Thing foo a 1 2 b 3 4 c 5 6 Thing1 Thing foo a 7 8 从语义角度来看 Thing 和 Thing1 是唯一的实体 然而 从语言实
  • 在另一个方法中使用时,无法解析 JComponent 名称

    我正在关注 YouTube 教程 http www youtube com watch v wpbQ0DCFF0M http www youtube com watch v wpbQ0DCFF0M 以使用数据库表填充名为 comboAcco
  • Android - 更改自定义 Spinner 的 DropDownItem 样式

    我有一个自定义微调器 我正在尝试替换 DropDownSelector 中的 9 块背景 三角形 但我就是无法让它正常工作 我最终得到 白盒是测试资产 新的 9 补丁已显示 但它弄乱了填充 并且看起来就像旋转器中的旋转器 这是没有添加 9
  • 从 Android 中的本机 c 返回 jbyteArray

    我使用本机 c 将数据从音频文件读取到 jbyte 指针 现在我想将它作为 jbyteArray 发送到 java jbyteArray Java com app audio player readData JNIEnv env jobje
  • 什么是GC空洞? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我用C 写了一个长TCP连接套接字服
  • 数据库更改后使用 Javascript 重新加载页面

    我正在显示数据库中的表 如下所示 tr td user gt id td td user gt td td user gt td td user gt td td user gt td td user gt td td user gt td
  • 如何更新 Python Pandas DataFrame 中特定行的值?

    借助 Pandas 中良好的索引方法 我可以毫无问题地以各种方式提取数据 另一方面 我仍然对如何更改现有 DataFrame 中的数据感到困惑 在下面的代码中 我有两个 DataFrame 我的目标是根据第二个 df 的值更新第一个 df
  • 为什么我的 COM 工厂在程序生命周期内从未被释放?

    我有一个本机 C ATL 进程内 COM 服务器 单独的测试程序 calls CoInitialize calls CoCreateInstance then calls Release 在指针上 然后打电话CoUnitialize 并退出
  • 检查移动网络可用的正确方法是什么(无数据连接)

    检查 Android 上移动网络 GSM 连接是否可用的正确方法是什么 gt 2 1 我不想检查移动网络是否有可用的数据连接 只需检查一般网络可用性 检查是否可以通过移动网络拨打电话 目前我正在使用以下检查 public static bo
  • 如何读取Spring XML配置中的application.yml?

    在我的项目中 我使用基于 XML 的配置 并且我正在尝试读取 application yml 文件 应用程序 yml vtp config priority 2 country US countryFriend UK AG 3 countr
  • 如何指定在 Netbeans 中使用哪个 JRE?

    我的系统中有两个 JRE 一种是 32 位 另一种是 64 位 在 Eclipse 中 我可以配置两者并在运行应用程序时选择使用哪一个 我想知道我是否可以在 Netbeans 中做同样的事情 我尝试转到 项目属性 库 然后尝试通过 管理平台
  • Asset Pipeline 预编译所有 asset 文件夹子目录

    我喜欢让我的资产高度组织起来 但是 我遇到了预编译问题 它没有选取子目录 以下是路径 assets gt fonts gt images gt gt backgrounds gt gt home gt gt icons 开发上一切正常 但生
  • node.js ejs包含错误

    我正在创建这个模板
  • libc++ 和 libstdc++ 之间的 istream eof 差异

    当链接到 libstdc 和 libc 时 以下 玩具 程序返回不同的内容 这是 libc 中的错误还是我不明白 istream eof 的工作原理 我尝试在 linux 和 mac os x 上使用 g 运行它 在 mac os x 上使