跨平台linux可用的printf_s之类的_s安全版函数

本文介绍了一种在不同版本Visual C++及跨平台环境中使用安全函数_s的方法。通过定义宏来适配VC2003及Linux环境,解决了_s系列函数的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 自动vc2005开始,微软力推_s安全版函数以取代不安全的标准非_s版函数,如果你不用安全版,VC会报一大堆难看的warning。现在问题来了,使用了_s版函数后,VC2003不能用了,而且想要把程序拿到linux也无法运行,你可以费劲巴拉的再改回非_s版,但是太费劲了,而且warning又来了,而且真的可能会不安全哦(高手忽略)。

有个简单的办法来解决这个问题,就是使用宏。在你的程序里定义一个macro.h文件,

#ifdef WIN32
#if _MSC_VER <1400        //vc2003
#define _DO_NOT_HAVE_S   //这个宏表示没有_s版,就是vc2003或者linux
#else
#endif    //VC2003
#else    //LINUX
#define _DO_NOT_HAVE_S
#endif    //WIN32

#ifdef _DO_NOT_HAVE_S    //如果没有_s版的函数,则启动如下的替换宏
//#define sprintf_s(buffer,size,format, ...) sprintf(buffer,format,__VA_ARGS__)
#include <stdio.h>
#include <stdarg.h>

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format ,...);    //这个比较特殊,需要真的去实现
#define memcpy_s(dest,num,src,count) memcpy(dest,src,count)
#define fprintf_s fprintf
#define _strdate_s(buf,num) _strdate(buf)
#define strcat_s(dest,num,src) strcat(dest,src)
#define fopen_s(pf,name,mode) *pf=fopen(name,mode)
#define strncpy_s(dest,num,src,count) strncpy(dest,src,count)
#define localtime_s(tm,time) *tm=*localtime(time)
#define _strdup strdup

#else
#define mkdir(pathname,mode) _mkdir(pathname)

#endif

上面的sprintf_s比较特殊,需要如下的macro.cpp里的实现

#ifdef _DO_NOT_HAVE_S
int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format ,...)
{
    va_list ap;

    va_start(ap, format);
    int res = vsprintf(buffer, format, ap);
    va_end(ap);
    return res;
}
#endif

跨平台及VC版本都OK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值