使用 Qt 标准库函数包装器的原因
Reason to use Qt standard library function wrappers
是否有任何理由使用 Qt 标准函数包装器,如 qstrncpy 而不是 strncpy?
我在文档中找不到任何提示。我很好奇是否存在任何功能差异。看起来让代码依赖于 Qt,即使在非强制性的地方也是如此。
我发现了这个:Qt wrapper for C libraries
但它没有回答我的问题。
这些函数的 Qt 包装器比标准包装器更安全,因为它们保证目标字符串始终以 null 结尾。 strncpy()
不保证这一点。
在 C11 中,strncpy_s() 和其他 _s()
后缀函数被添加为安全字符串函数。但是,它们在任何 C++ 标准中都不可用,它们仅适用于 C。 Qt 包装器解决了这个问题。
这些方法是 Qt 平台独立性努力的一部分。 Qt 试图隐藏平台差异并使用每个平台必须提供的最佳功能,在不可用的平台上复制该功能。这是 the documentation of qstrncpy
必须要说的:
A safe strncpy() function.
Copies at most len bytes from src (stopping at len or the terminating '[=13=]' whichever comes first) into dst and returns a pointer to dst. Guarantees that dst is '[=13=]'-terminated. If src or dst is nullptr, returns nullptr immediately.
[…]
Note: When compiling with Visual C++ compiler version 14.00 (Visual C++ 2005) or later, internally the function strncpy_s will be used.
所以 qstrncpy
比 strncpy
更安全。
是否有任何理由使用 Qt 标准函数包装器,如 qstrncpy 而不是 strncpy?
我在文档中找不到任何提示。我很好奇是否存在任何功能差异。看起来让代码依赖于 Qt,即使在非强制性的地方也是如此。
我发现了这个:Qt wrapper for C libraries 但它没有回答我的问题。
这些函数的 Qt 包装器比标准包装器更安全,因为它们保证目标字符串始终以 null 结尾。 strncpy()
不保证这一点。
在 C11 中,strncpy_s() 和其他 _s()
后缀函数被添加为安全字符串函数。但是,它们在任何 C++ 标准中都不可用,它们仅适用于 C。 Qt 包装器解决了这个问题。
这些方法是 Qt 平台独立性努力的一部分。 Qt 试图隐藏平台差异并使用每个平台必须提供的最佳功能,在不可用的平台上复制该功能。这是 the documentation of qstrncpy
必须要说的:
A safe strncpy() function.
Copies at most len bytes from src (stopping at len or the terminating '[=13=]' whichever comes first) into dst and returns a pointer to dst. Guarantees that dst is '[=13=]'-terminated. If src or dst is nullptr, returns nullptr immediately.
[…]
Note: When compiling with Visual C++ compiler version 14.00 (Visual C++ 2005) or later, internally the function strncpy_s will be used.
所以 qstrncpy
比 strncpy
更安全。