我正在阅读“ C ++食谱”,其中包含以下代码段:
// cout << s << std::endl; // You shouldn't be able to
wcout << ws << std::endl; // run these at the same time
如果您有兴趣查看实际示例,请访问以下指向Google图书页面的链接。
另外,我发现了这个SO问题,似乎表明将wcout和cout混合是可以的。有人可以向我解释此评论在说什么吗?
编辑
从C ++标准[27.4.1]:
相应的宽字符流和窄字符流的混合操作遵循与在FILEs上混合此类操作相同的语义,如ISO C标准的修订1所指定。
根据C标准[7.19.2]:
每个流都有一个方向。在将流与外部文件关联之后,但是在对该文件执行任何操作之前,该流没有方向。一旦将宽字符输入/输出功能应用于没有方向的流,该流将成为面向宽方向的流。类似地,一旦将字节输入/输出功能应用于没有方向的流,该流将成为面向字节的流。否则,只有对freopen函数或fwide函数的调用才能更改流的方向。(成功调用freopen会删除所有方向。)
字节输入/输出功能不得应用于宽方向的流,而宽字符输入/输出功能不应适用于面向字节的流。
因此,该标准似乎表明您不应该将它们混合使用。但是,我从这篇文章中找到了这句话:
对于Visual C ++ 10.0,fwide函数记录为未实现。从实际的角度来看,至少在输出整行的水平上,显然可以将cout和wcout混合使用。因此,令人高兴的是,Visual C ++显然只是无视该标准的要求,而没有维护不切实际的显式C FILE流定向。
而且,关于gcc,我从这里找到了这句话:
这是一项(新)功能,而不是错误,请参阅libstdc ++ / 11705,以及有关C标准(C99,7.19.2)中流方向的一般信息。简而言之,您不能将面向字节的I / O和面向宽方向的I / O混合使用。现在,由于 libstdc ++ / 11705中指出的错误,您可以通过调用std :: ios :: sync_with_stdio(false);获得接近预期的效果。在程序开始时。
四季花海
蛊毒传说
当年话下
相关分类