Hi, During my vacation, the last bits of my qsnprintf() work have merged. The user-visible changes are:
- qsnprinf() has gained the __attribute__((format(printf))) it has been lacking since its inception, so -Wformat now works (and has caught some problems in Qt). The attribute has been picked back all the way to 5.15, as -Wformat may highlight security-critical failures in user code. - qsnprintf() is now deprecated for C++11 std::snprintf(), because the former shows _more_ platform variability than the latter. We felt like we couldn't make qsnprintf() simply call std::snprintf(), because users may depend on platform specifics like use of the QString::asprintf().toLocal8bit() fallback some platforms (most notably WASM and Android) still use, and which treats esp. %ls and %a differently from std::snprintf(). There's also the issue of "wrong" return types on Windows, where qsnprintf() is implemented in terms of snprintf_s(). - There's now a QT_NO_QSNPRINTF macro which removes the function altogether from the API (and all Qt code is compiled with this enabled) As I mentioned in the 2nd bullet point, the reason I've done the changes is that qsnprintf() was meant to provide a cross-platform implementation of snprintf() (which wasn't standardized for C++ before C++11), but not only did it fail to _decrease_ platform variability by mapping certain non-standard behaviour (snprintf_s return types) to the C99 standard behaviour, it actually _increased_ platform incompatibility by introducing an even-more-incompatible fallback via QString::asprintf(). This should be a lesson to write such wrappers in the future with std (whichever std that is) compat in mind, cf. qNN headers. As for porting, most uses port straightforwardly to std::snprintf() (also the -v- version). The exception is when you inadvertently or knowingly depended on platform-specific behaviour. If you need %ls to work for char16_t* (instead of wchar_t*), your best option is to port to QString::asprintf() or QString::arg(). If you depend on the particular Windows return values, you'll need to fix that, too. The rest should be ok with s/q(v?)snprintf/std::\1snprintf/g; Thanks, Marc -- Marc Mutz <marc.m...@qt.io> (he/his) Principal Software Engineer The Qt Company Erich-Thilo-Str. 10 12489 Berlin, Germany www.qt.io Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen Sitz der Gesellschaft: Berlin, Registergericht: Amtsgericht Charlottenburg, HRB 144331 B -- Development mailing list Development@qt-project.org https://lists.qt-project.org/listinfo/development