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

时间:2024-03-07 16:09:20

 自动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

 

转自:http://blog.csdn.net/avagrant158/article/details/4737297