【发布时间】:2012-02-15 09:42:28
【问题描述】:
我正在阅读具有以下 sn-p 的“C++ Cookbook”:
// cout << s << std::endl; // You shouldn't be able to
wcout << ws << std::endl; // run these at the same time
如果您有兴趣查看实际示例,这里是a link to the page on Google books。
另外,我发现这个SO question 似乎表明混合 wcout 和 cout 是可以的。有人可以向我解释一下这条评论在说什么吗?
编辑
来自 C++ 标准 [27.4.1]:
在相应的宽字符流和窄字符流上混合操作遵循与在 FILE 上混合此类操作相同的语义,如 ISO C 标准的修订 1 中所述。
来自 C 标准 [7.19.2]:
每个流都有一个方向。在流与外部文件关联之后,但是 在对其执行任何操作之前,流是没有方向的。一旦宽 字符输入/输出功能已应用于无方向的流,该流变成了宽方向的流。同样,一旦一个字节输入/输出函数具有 被应用到一个没有方向的流上,这个流就变成了一个面向字节的流。 只有调用 freopen 函数或 fwide 函数才能改变 流的方向。 (成功调用 freopen 会删除任何方向。)
字节输入/输出函数不应应用于面向宽的流和宽 字符输入/输出函数不应应用于面向字节的流。
所以,标准似乎说你不应该混合它们。但是,我找到了这句话from this article:
对于 Visual C++ 10.0,fwide 函数被记录为未实现。从实际的角度来看,至少在输出整行的层面上,混合使用 cout 和 wcout 显然可以正常工作。因此,令人高兴的是,Visual C++ 显然只是无视标准的要求,并且没有保持不切实际的显式 C 文件流方向。
另外,关于 gcc,我从here 找到了这句话:
这是一个(新的)功能,而不是错误,请参阅 libstdc++/11705 和一般搜索 关于 C 标准 (C99, 7.19.2) 中的流方向。简而言之你 不能混合面向字节和面向宽的 I/O。目前,由于 错误 在 libstdc++/11705 中指出,您可以获得接近您的 通过调用 std::ios::sync_with_stdio(false);在。。。之初 你的程序。
【问题讨论】:
标签: c++