首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >混合std::wcout和std::cout会出错,有什么问题吗?

混合std::wcout和std::cout会出错,有什么问题吗?
EN

Stack Overflow用户
提问于 2019-05-03 03:20:11
回答 1查看 221关注 0票数 4

下面的程序是使用g++编译的,它只打印std::wcout表达式。但是如果您取消对第8行的注释,它会正确地打印三个表达式。

我想知道这种奇怪行为的原因。

代码语言:javascript
复制
#include <iostream>
#include <cstring>
#include <boost/format.hpp>

int main () {
  int x = 10; 
  wchar_t str[] = L"Hello, world!";
//  std::cout << "what?" << std::endl;
  std::wcout << L"str = \"" << str << L"\" | len = " << wcslen(str) << L"\n";
  std::cout << boost::format("x = %d | &x = %p") % x % &x << std::endl;
  return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2019-05-03 03:49:03

引用this page

程序不应该将cout上的输出操作与wcout上的输出操作(或标准输出上的其他面向宽的输出操作)混合在一起:一旦对其中任何一个执行了输出操作,标准输出流就会获得一个方向(无论是窄的还是宽的),只有在标准输出上调用freopen才能安全地更改该方向。

当您首先使用cout时,它起作用的原因是您的实现允许wcout输出到面向字节的流。这并不是所有实现都能保证的。正如引用的文本中所提到的,在它们之间切换的唯一正确方法是使用freopen,如下所示:

代码语言:javascript
复制
#include <cstdio>
#include <iostream>

int main () {
  std::wcout << L"Hello" << std::flush;
  freopen(nullptr, "a", stdout);
  std::cout << " world\n" << std::flush;
}

但是,避免将它们混合使用可能会更简单。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55958929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档