对于包含安全字符串函数的Visual Studio版本,需要一个#define(以避免_CRT_SECURE_NO_DEPRECATE)
||
不久前,我尝试使用Visual Studio 2010编译使用我在Visual Studio 2003中编写的库的MFC程序。毫不奇怪,我收到了一堆关于弃用和使用各种字符串函数的安全版本的警告。
然后,我更新了库中的相关功能以使用安全功能,并且编译良好。
后来,我尝试使用Visual Studio 2003在其他系统上再次对其进行编译,但对不存在的安全功能感到困惑。
我决定创建一种混合方法,该方法将允许我编译在两种环境中使用该库的程序,并在可用的情况下利用安全功能,如果没有,则将其别名为旧功能。
最初,我考虑过检查每个功能,以查看是否存在安全版本,但这无法正常工作,并且每个功能都需要单独工作:
#ifndef strcpy_s
#define strcpy_s(a,b,c) strcpy(a,c)
#endif
#ifndef strcat_s
#define strcat_s(a,b,c) strcat(a,c)
#endif
…
因此,我试图找出一种确定安全功能是否存在的方法。我知道它们是在Visual Studio 2005中引入的,但是是否有一个“ 1”或可以按以下方式使用的东西?
#ifndef SECURE_FUNCTIONS // or #ifdef VS_VER_2005, #if (VS_VER >= 0x2005) etc.
#define strcpy_s(a,b,c) strcpy(a,c)
#define strcat_s(a,b,c) strcat(a,c)
…
#endif
我检查了crtdefs.h
,但发现没有任何用处。
没有找到相关结果
已邀请:
2 个回复
盛虱
宏/定义使这一过程变得简单。由于安全字符串函数是在Visual Studio 2005(VC ++版本
)中添加的,因此只需执行以下操作:
现在,当代码在VS2005 +下进行编译时,它将具有更高的安全性;而在VS2003-上进行编译时,即使没有额外的安全性,仍然可以进行编译而无需修改。 这使移植和更新更加容易,因为即使您还不能使用VS2005 +进行编译,也可以更新库函数并在代码中使用安全字符串函数。这样,当您升级编译器时,无需对库或代码进行任何更改即可获得好处。它还使在旧版本和更新版本的Visual Studio上同时在同一代码库上进行工作变得更加容易(至少在某种程度上)。
荤碗
返回打印字符串所需的字符数,而不是 无论终止缓冲区的大小如何,都要计算终止的空字符。 我不认为snprintf本身会引发异常,但会导致无效的内存访问 将。 如果buff足够大,则
将返回与snprintf相同的值,但是 如果buff太小,或者buff或fmt是NULL指针,则_snprintf_s调用 无效的参数处理程序,分别设置errno = ERANGE或EINVAL, 并返回-1。 如果异常行为在旧代码中很重要,则从旧的传统函数转换为安全版本时请注意。 几年来,我一直在努力使用Microsoft \“ _ s \”的安全功能,特别是在编写为Visual Studio中的Windows平台和使用gcc / g ++的\'nix平台编译的代码时。重复使用旧的源代码时也很痛苦,因为要遍历代码将fprintf()更改为fprintf_s()等很麻烦。_CRT_SECURE_NO_DEPRICAT宏会禁止弃用警告,但我从来都不喜欢在不解决潜在问题的情况下关闭编译器警告;发出警告是有原因的。 我的临时补丁(我会不时承认,我仍然会用它)是一个包含宏的包含文件和一些内联函数,用于映射传统的安全函数。当然,映射不会模仿异常行为和返回值。如果需要,您也可以编写函数来模仿它,但是在某些时候,使用安全函数并更改旧代码以执行相同操作将变得更加容易。而且,某些安全功能不能容易地被映射,例如。 sprinf到sprintf_s。 这是我的包含文件(注释多于代码,但值得一读,恕我直言):