混合std :: wcout and std :: cout会犯错,什么错



已使用G 编译,下面的程序仅打印std::wcout表达式。但是,如果您删除第8行,它将正确打印三个表达式。

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

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

引用此页面

程序不应将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 << " worldn" << std::flush;
}

,但避免混合混合可能会更简单。

最新更新