我有一个Q_ASSERT()

Q_ASSERT(QString("%1").arg(0) != "0");


如果失败,则会显示“中止/重试/忽略”消息框,但在文本中显示:

File: f:\dd\vctools\crt_bld\self_x86\crt\src\output.c
Line: 1120
Expression: ("Incorrect format specifier", 0)


使用此调用堆栈:

0   _output_s_l output.c    1120    0x5dbee38d
1   _vsnprintf_helper   vsprintf.c  140 0x5dbb00e8
2   _vsnprintf_s_l  vsprintf.c  288 0x5dbb0610
3   _vsnprintf_s    vsprintf.c  340 0x5dbb0880
4   _VCrtDbgReportA dbgrptt.c   301 0x5dc2571e
5   _CrtDbgReportV  dbgrpt.c    241 0x5dc24992
6   _CrtDbgReport   dbgrpt.c    258 0x5dc2494b
7   qt_message_output   qglobal.cpp 2232    0x5d43bacf
8   qt_message  qglobal.cpp 2298    0x5d43bc69
9   qFatal  qglobal.cpp 2481    0x5d43c059
10  qt_assert   qglobal.cpp 1999    0x5d43b629


但是,如果我将其更改为:

Q_ASSERT(QString("0").arg(0) != "0");


它按预期工作,显示

File: global\qglobal.cpp
Line: 2232

ASSERT: "QString("0").arg(0) != "0"" in file ..\MyProject\tester.cpp, line 132


那么,为什么出现这种奇怪的行为,这是Qt中的错误吗?

最佳答案

事实证明,这是Qt中的错误,在qt_message_output中它们具有以下行:

int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, buf);


本来应该

int ret = _CrtDbgReport(_CRT_ERROR, __FILE__, __LINE__, QT_VERSION_STR, "%s", buf);


他们将Q_ASSERT()中包含的整行作为格式说明符传递。

关于c++ - Q_ASSERT-“格式说明不正确”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18786086/

10-11 21:05