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