我最近将我的 IDE 更改为来自 MSVC++ 6 的 MS Visual Studio 2005,并且收到了很多弃用警告。我没有忽略警告,而是开始将它们更改为 _s 等效项。但是,我后来发现这些只是微软的实现。
我在某处读到他们正在推动这些成为标准的一部分。是吗?
使用这些 _s 函数是个好主意吗?还是我应该使用其他东西?
谢谢。
这些*_s()
函数不是 C 标准的一部分,但有一个待定的“技术报告”建议添加它们(我不确定 TR 中的例程是否与 Microsoft 的例程完全相同,或者它们是否只是相似) .
TR 24731-1:C 库扩展第一部分:边界检查接口:
如果您想继续使用旧功能,您可以通过定义宏来保持弃用警告安静_CRT_SECURE_NO_WARNINGS
(_CRT_SECURE_NO_DEPRECATE
可能仍受支持)。
您升级了 IDE 并升级了 Microsoft 库。坦率地说,您可以继续使用您的旧库,因为它们会继续保留(为了向后兼容),尽管 Microsoft 已经表示他们实际上将开始删除其中一些旧功能。我想说,如果您正在向前发展,那么您可以使用更新的功能;如果您正在向后开发(或不担心版本是什么),那么您可能想要使用较旧的功能。
如果您的目标是 Microsoft 平台,请务必使用它们。即使您不是,您也可以在需要将软件移植到非 Microsoft 平台时(或如果)自己实现它们。
最坏的情况是你最终使用了几个#ifdef
s 来有条件地编译。
据我所知,他们正在考虑进行标准化。该提案是TR 24731。
至于使用它们是否是一个好主意,我会说是的。我不太喜欢他们捕获错误的方式,但我相信您可以为他们提供自己的处理程序。如果您需要跨平台兼容性,您有两种选择:在非 Windows 平台上使用宏实现它们或关闭弃用警告。
在对大型代码库进行审查后,我确定几乎不可能让所有程序员都正确使用 C 标准库函数进行字符串操作,因此所有旨在纠正这一点的内容都是值得欢迎的。
您应该使用标准函数并禁用 Microsoft 默认打开的任何虐待狂警告,以阻止您编写符合标准的代码。我严重怀疑“_s 函数”是否会被添加到标准 C 中(尽管它们已被提议),因为它们是单个供应商的发明,并且从未被任何其他供应商实现过。(嘿,让我们将所有 POSIX 合并到 C 标准中,而我们正在使用它......)