c++ - Q_ASSERT - "Incorrect format specifier"

标签 c++ qt

我有一个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的bug,在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 - "Incorrect format specifier",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18786086/

相关文章:

qt - QGraphicsScene::itemAt() - 如何识别自定义类

c++ - 在 Qt 5 中重用现有的 QDirIterator

c++ - Boost multiprecision 失败,因为 complex 的实现试图在 _Isinf 或 _Isnan 等内部函数中转换为 double

c++ - 带有 BORDER_REFLECT 的 openCV 重新映射不起作用

c++ - 为我的球员名单选择最佳结构

android - 如何使用 ant 命令行来选择我的自定义 build.xml

c++ - Qt/C++ : Is "static_cast" ok for casting in this snippet of code?

c++ - Qt QJsonObjects - 列表比一层更深?

c++ - 重用的boost ptree是否需要清除?

c++ - 如何在 C++ 中查找字符串数组中的元素数?