c - _setmode 函数导致调试错误
Posted
技术标签:
【中文标题】c - _setmode 函数导致调试错误【英文标题】:c - _setmode function causing debug error 【发布时间】:2015-11-24 23:15:27 【问题描述】:好的,所以在发布this question 之后,我尝试使用社区指出的相关问题(特别是this)中提供的解决方案,但我遇到了另一个问题。
当尝试使用 _setmode()
函数更改 Windows 控制台以打印 UTF 字符时,我收到一个调试错误,就像在 this other question 上发布的错误一样。调试错误如下:
文字:
调试断言失败!
程序: ...kout-Desktop_Qt_5_5_0_MSVC2013_64bit-Debug\debug\Breakout.exe 文件:f:\dd\vctools\crt\crtw32\stdio\output.c 线路:1033
表达式:((_Stream->_flag & _iosTRG) || ( fn = _fileno(_Stream), ( (_textmode_safe(fn) == _IOINFO_TM_ANSI) && !_tm_unicode_safe(fn))))
有关您的程序如何导致断言失败的信息,请参阅有关断言的 Visual C++ 文档。
(按重试调试应用程序)
截图:
如果没有_setmode()
函数,我仍然无法从上面的 ASCII 表中打印字符,例如:“┌──┐”。我能做些什么来解决这个问题?同样问题的解法也行不通。
再次,我在 Windows 上使用 Qt Creator,Qt 版本 5.5.0 MSVC 64 位。编译器是 Microsoft Visual C++ Compiler 12.0 (amd64)。
编辑:这是一个导致错误的小示例代码:
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
int main(void)
//Using setmode to force the error
_setmode(_fileno(stdout), _O_U16TEXT);
printf("Hello World!\n");
return 0;
执行时出现错误。
【问题讨论】:
也许您可以发布一个显示问题的最小、完整的程序? 添加示例代码! 在我的情况下,当我发现我在像你一样调用 _setmode 之后仍然调用 cout 而不是 wcout 时,它停止了它。更改为 wcout,断言错误消失了。 【参考方案1】:看来如果你把输出模式设置为UTF-16,那么你必须使用wprintf而不是printf。
(大概,既然你已经告诉运行时从 UTF-16 转换,你必须提供 UTF-16。)
这段代码在我的机器上运行:
#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;
也是这样
wprintf(L"Hello world!\n");
PS - 我不确定这是否会解决您的潜在问题,我怀疑这与源文件的编码有关。即使使用 UTF-16确实解决了您的问题,它也可能不是最好的解决方案。
【讨论】:
它不起作用,因为程序输出错误而不管它上面发生了什么。我尝试寻找编码但没有取得任何进展,我只是在 IDE 上搞砸了一些文件的表示。 您可以试试我刚刚添加到答案中的代码吗?它对我来说很好,当然我的字体不包含西里尔字符,所以我只得到问号。 (但看起来你原来的问题已经解决了,关于另一个问题?) 它没有用。正如我所说,无论代码上发生了什么,这行都会导致错误。我接受了另一个问题的答案,因为它作为问题的根源是有道理的,但它仍然没有解决它。我想我会回到解决方法。 我只能假设 Qt 正在做一些奇怪的事情,因为在正常的应用程序中代码可以工作。以上是关于c - _setmode 函数导致调试错误的主要内容,如果未能解决你的问题,请参考以下文章
_mm256_load_ps 在调试模式下导致 google/benchmark 出现分段错误