查找 L“%s” 等宽字符串问题的最佳方法是什么?
-
16-09-2019 - |
题
这是我所说的令人头疼的问题之一的示例:
我们有一个多平台项目,主要使用 Unicode 字符串将文本渲染到屏幕上。在 Windows 上,VC++ 中的行:
swprintf(swWideDest, LEN, L"%s is a wide string", swSomeWideString);
编译良好并将宽字符串打印到另一个宽字符串中。然而,这实际上应该是:
swprintf(swWideDest, LEN, L"%ls is a wide string", swSomeWideString);
如果不将“%s”替换为“%ls”,这将无法在其他平台上运行。因为在我们的 Windows 环境中进行测试更容易、更快,而且调试起来也更简单。此类错误很容易被忽视。
我知道最好的解决方案是首先编写正确的代码,但在压力下会犯简单的错误,在这种特殊情况下,错误很容易在很长一段时间内被忽视。
我怀疑这种错误有很多变化,我们还没有享受到。
有没有人有一个很好又简洁的方法来发现这些类型的错误?
:D
解决方案
由于没有任何功能 *printf
family 是类型安全的,你也可以
- 通过正则表达式搜索可能的错误并手动修复它们
- 使用另一种类型安全的方法,可能基于字符串流或 升压格式
其他提示
您可能想看看 快速格式化 如果 Boost.Format 太慢而无法满足您的需求。
与 stringstreams 和 Boost.Format 相比:
- IO 流:fastformat.format在所有情况下都比iostreams快于100-900%
- 升压格式:fastformat.format比boost.format快于400-1650%,在所有情况下
不隶属于 StackOverflow