#include <fcntl.h>
#include <io.h>
#include <stdio.h>
int main(void) {
_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
return 0;
}
编译时返回错误:_O_U16TEXT was not declared in this scope
这是一个显示塞与此编译器?
3条答案
按热度按时间syqv5f0l1#
有个简单的解决办法只需使用这些常量的值而不是它们的名称。例如,
_O_U16TEXT
是0x00020000
,_O_U8TEXT
是0x00040000
。我刚刚确认它可以在Windows 10上使用g++ 4.8.1与
_setmode
一起使用:t2a7ltrp2#
在更高的g++版本(我使用的是12.2.0)中,
#include <fcntl.h>
包含_O_U16TEXT
、_O_WTEXT
和_O_BINARY
等宏。这是整个
<fctl.h>
文件。您可以在其中看到所有macros
及其values
。esyap4oy3#
别费心了。
您的用户需要将其控制台的字体设置为unicode字体(例如Lucida控制台),否则它将不会显示任何内容。如果您的目标是东亚,那里的默认字体是unicode,它将显示良好,但在欧洲,您必须手动更改字体。
用户不会因为你在自述文件中写了字体而改变他们的控制台字体,他们甚至不会读自述文件,他们只会看到它显示垃圾,他们会认为程序不工作。
另外,这是VS 2005的一个新功能,所以你需要链接VS 2005可再发行版,msvcr50.dll或更新的版本(默认情况下mingw链接到msvcrt.dll)。
我认为一个简单的管道会杀死你的新的和闪亮的unicode文本。让我们说你的exe命名为a.exe。我很肯定,
a.exe | more
将不会显示unicode文本。