在我的Windows/Visual C环境中,有许多替代方法可以执行相同的基本字符串操作任务.
例如,为了进行字符串复制,我可以使用:
strcpy,ANSI C标准库函数(CRT)lstrcpy,kernel32.dll中包含的版本StrCpy,来自Shell Lightweight Utility库StringCchCopy/ StringCbCopy,来自"安全字符串"库strcpy_s,安全增强版CRT虽然我理解所有这些替代方案都有历史原因,但我可以为新代码选择一组一致的函数吗?哪一个?或者我应该根据具体情况选择最合适的功能?
Wiz*_*ard 13
首先,让我们回顾一下每个功能集的优缺点:
strcpy如果您正在开发可移植C代码,那么函数是唯一的选择.即使在仅限Windows的项目中,将可移植代码与依赖于操作系统的代码分开也许是明智之举.
这些功能通常具有装配级优化,因此非常快.
有一些缺点:
strncpy类似lstrcpy的函数由kernel32导出,只有在尝试避免对CRT的依赖时才应使用.您可能希望这样做有两个原因:
CreateThread而不是启动一个线程_beginthread).此外,kernel32函数可以比CRT版本更优化:当您的可执行文件将在针对Core i13优化的Windows 9上运行时,kernel32 可以使用程序集优化版本.
以下是对kernel32函数所做的相同考虑,以及一些更复杂函数的附加值.但是我怀疑他们是否积极维护,我会跳过它们.
该StringCchCopy/ StringCbCopy函数通常是我个人的选择:他们是很好的设计,功能强大,而且快得惊人(我还记得那个白皮书这些功能相比,性能提升到CRT当量).
这些函数具有与ANSI C等价物非常相似的无可置疑的优点,因此移植遗留代码是一件小事.我特别喜欢基于模板的版本(当然,只有在编译为C++时才可用).我真的希望它们最终会标准化.不幸的是,他们有许多缺点:
虽然我个人最喜欢的Windows开发是StrSafe库,但我的建议是尽可能使用ANSI C函数,因为便携式代码总是一件好事.
在现实生活中,我开发了一个个性化的可移植库,其原型类似于Security-Enhanced CRT功能(包括基于强大的模板的技术),它依赖于Windows上的StrSafe库和其他平台上的ANSI C功能.