已使用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;
}
,但避免混合混合可能会更简单。