将std :: wcout和std :: cout混合会出错,这是怎么回事?

时间:2019-05-02 19:20:11

标签: c++ cout widechar

已经使用g ++进行了编译,下面的程序仅输出std::wcout表达式。但是,如果取消注释第八行,它将正确打印三个表达式。

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

#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;
}

1 个答案:

答案 0 :(得分:5)

引用this page

  

程序不应将cout上的输出操作与wcout上的输出操作(或stdout上的其他宽方向输出操作)混合:一旦对其中一个执行了输出操作,则标准输出流将获得方向(两个或宽)只能通过在stdout上调用freopen来安全地更改。

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

#include <cstdio>
#include <iostream>

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

但是避免混合它们可能更简单。