_tgetenv(),_tcscat() ,setmode(),_tsplitpath()等函数的 was declared deprecated 警告
2012-02-23 10:12
387 查看
这些函数因为不是十分安全的,对于内存不够的时候处理并不完善,所以建议使用 更为安全的函数版本
比如_tgetenv_s();_tcscat_s(),_tsplitpath_s()等
_tgetenv_s()函数声明:
[cpp] view
plaincopy
errno_t getenv_s(
size_t *pReturnValue,
char* buffer,
size_t numberOfElements,
const char *varname
);
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *varname
);
template <size_t size>
errno_t getenv_s(
size_t *pReturnValue,
char (&buffer)[size],
const char *varname
); // C++ only
template <size_t size>
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t (&buffer)[size],
const wchar_t *varname
); // C++ only
_tgetenv_s()用法如下:
[cpp] view
plaincopy
TCHAR *querystringvar;
size_t requiredsize;
_tgetenv_s(&requiredsize,NULL,0,_T("QUERY_STRING"));
querystringvar = (TCHAR *)malloc(requiredsize * sizeof(TCHAR));
if(!querystringvar)
{
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("获取QUERY_STRING时内存分配失败!/n");
exit(1);
}
_tgetenv_s( &requiredsize, querystringvar, requiredsize, _T("QUERY_STRING") );
CString strdata(querystringvar);
free(querystringvar);
querystringvar = NULL;
_setmode() ,如_setmode(_fileno(stdout),_O_BINARY);需要的头文件为
#include <io.h>//_setmode()需要
#include <fcntl.h>//_O_BINARY 需要
用法:
[cpp] view
plaincopy
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main( void )
{
int result;
// Set "stdin" to have binary mode:
result = _setmode( _fileno( stdin ), _O_BINARY );
if( result == -1 )
perror( "Cannot set mode" );
else
printf( "'stdin' successfully changed to binary mode/n" );
}
对于 _tcscat_s() MSDN上如下声明:
[c-sharp] view
plaincopy
errno_t strcat_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
errno_t wcscat_s(
wchar_t *strDestination,
size_t numberOfElements,
const wchar_t *strSource
);
errno_t _mbscat_s(
unsigned char *strDestination,
size_t numberOfElements,
const unsigned char *strSource
);
template <size_t size>
errno_t strcat_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
template <size_t size>
errno_t wcscat_s(
wchar_t (&strDestination)[size],
const wchar_t *strSource
); // C++ only
template <size_t size>
errno_t _mbscat_s(
unsigned char (&strDestination)[size],
const unsigned char *strSource
); // C++ only
自己的例子:
[cpp] view
plaincopy
if(_tcscat_s(drivename,dirname) != 0)
{
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("瓦片库路径过长,程序将退出/n");
exit(1);
}
_tsplitpath_s() 声明如下:
[cpp] view
plaincopy
errno_t _splitpath_s(
const char * path,
char * drive,
size_t driveSizeInCharacters,
char * dir,
size_t dirSizeInCharacters,
char * fname,
size_t nameSizeInCharacters,
char * ext,
size_t extSizeInBytes
);
errno_t _wsplitpath_s(
const wchar_t * path,
wchar_t * drive,
size_t driveSizeInCharacters,
wchar_t *dir,
size_t dirSizeInCharacters,
wchar_t * fname,
size_t nameSizeInCharacters,
wchar_t * ext,
size_t extSizeInCharacters
);
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _splitpath_s(
const char *path,
char (&drive)[drivesize],
char (&dir)[dirsize],
char (&fname)[fnamesize],
char (&ext)[extsize]
); // C++ only
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _wsplitpath_s(
const wchar_t *path,
wchar_t (&drive)[size],
wchar_t (&dir)[size],
wchar_t (&fname)[size],
wchar_t (&ext)[size]
); // C++ only
自己的例子
[cpp] view
plaincopy
if(_wsplitpath_s(apppath,drivename,dirname,filename,extname) != 0)
//
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("瓦片库路径过长,程序将退出/n");
exit(1);
从上面的例子可以看出,对于这些函数,若是指针传递,则比原先不安全的版本多一个大小限制,而对于已经申请好的字符串引用传递,则可以和以前一样用(仅限C++,C里面没有引用),基本若是成功,则返回值为0,有误为其他返回值。
更详细的见MSDN
转帖:http://blog.csdn.net/shiwei0124/article/details/4923689
比如_tgetenv_s();_tcscat_s(),_tsplitpath_s()等
_tgetenv_s()函数声明:
[cpp] view
plaincopy
errno_t getenv_s(
size_t *pReturnValue,
char* buffer,
size_t numberOfElements,
const char *varname
);
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t *buffer,
size_t numberOfElements,
const wchar_t *varname
);
template <size_t size>
errno_t getenv_s(
size_t *pReturnValue,
char (&buffer)[size],
const char *varname
); // C++ only
template <size_t size>
errno_t _wgetenv_s(
size_t *pReturnValue,
wchar_t (&buffer)[size],
const wchar_t *varname
); // C++ only
_tgetenv_s()用法如下:
[cpp] view
plaincopy
TCHAR *querystringvar;
size_t requiredsize;
_tgetenv_s(&requiredsize,NULL,0,_T("QUERY_STRING"));
querystringvar = (TCHAR *)malloc(requiredsize * sizeof(TCHAR));
if(!querystringvar)
{
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("获取QUERY_STRING时内存分配失败!/n");
exit(1);
}
_tgetenv_s( &requiredsize, querystringvar, requiredsize, _T("QUERY_STRING") );
CString strdata(querystringvar);
free(querystringvar);
querystringvar = NULL;
_setmode() ,如_setmode(_fileno(stdout),_O_BINARY);需要的头文件为
#include <io.h>//_setmode()需要
#include <fcntl.h>//_O_BINARY 需要
用法:
[cpp] view
plaincopy
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
int main( void )
{
int result;
// Set "stdin" to have binary mode:
result = _setmode( _fileno( stdin ), _O_BINARY );
if( result == -1 )
perror( "Cannot set mode" );
else
printf( "'stdin' successfully changed to binary mode/n" );
}
对于 _tcscat_s() MSDN上如下声明:
[c-sharp] view
plaincopy
errno_t strcat_s(
char *strDestination,
size_t numberOfElements,
const char *strSource
);
errno_t wcscat_s(
wchar_t *strDestination,
size_t numberOfElements,
const wchar_t *strSource
);
errno_t _mbscat_s(
unsigned char *strDestination,
size_t numberOfElements,
const unsigned char *strSource
);
template <size_t size>
errno_t strcat_s(
char (&strDestination)[size],
const char *strSource
); // C++ only
template <size_t size>
errno_t wcscat_s(
wchar_t (&strDestination)[size],
const wchar_t *strSource
); // C++ only
template <size_t size>
errno_t _mbscat_s(
unsigned char (&strDestination)[size],
const unsigned char *strSource
); // C++ only
自己的例子:
[cpp] view
plaincopy
if(_tcscat_s(drivename,dirname) != 0)
{
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("瓦片库路径过长,程序将退出/n");
exit(1);
}
_tsplitpath_s() 声明如下:
[cpp] view
plaincopy
errno_t _splitpath_s(
const char * path,
char * drive,
size_t driveSizeInCharacters,
char * dir,
size_t dirSizeInCharacters,
char * fname,
size_t nameSizeInCharacters,
char * ext,
size_t extSizeInBytes
);
errno_t _wsplitpath_s(
const wchar_t * path,
wchar_t * drive,
size_t driveSizeInCharacters,
wchar_t *dir,
size_t dirSizeInCharacters,
wchar_t * fname,
size_t nameSizeInCharacters,
wchar_t * ext,
size_t extSizeInCharacters
);
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _splitpath_s(
const char *path,
char (&drive)[drivesize],
char (&dir)[dirsize],
char (&fname)[fnamesize],
char (&ext)[extsize]
); // C++ only
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _wsplitpath_s(
const wchar_t *path,
wchar_t (&drive)[size],
wchar_t (&dir)[size],
wchar_t (&fname)[size],
wchar_t (&ext)[size]
); // C++ only
自己的例子
[cpp] view
plaincopy
if(_wsplitpath_s(apppath,drivename,dirname,filename,extname) != 0)
//
fprintf(stdout, "Content-Type:text/html;charset=gbk;");
fprintf(stdout, "/n/n");
printf("瓦片库路径过长,程序将退出/n");
exit(1);
从上面的例子可以看出,对于这些函数,若是指针传递,则比原先不安全的版本多一个大小限制,而对于已经申请好的字符串引用传递,则可以和以前一样用(仅限C++,C里面没有引用),基本若是成功,则返回值为0,有误为其他返回值。
更详细的见MSDN
转帖:http://blog.csdn.net/shiwei0124/article/details/4923689
相关文章推荐
- _tgetenv(),_tcscat() ,setmode(),_tsplitpath()等函数的 was declared deprecated 警告
- 在VS2005下编译was declared deprecated警告
- VS2005 出现警告warning C4996: strcpy was declared deprecated 的解决办法
- 在C++遇到有些关键字或者函数被弃用的情况,比如xxx was declared deprecated
- warning C4996: '_snprintf' was declared deprecated 警告信息的消除方法
- (转)出现这样的警告 warning C4996: strcpy was declared deprecated
- 《转》在VS2005下编译was declared deprecated警告
- warning C4996: ''strcpy'' was declared deprecated
- warning C4996: 'strcpy' was declared deprecated
- 《warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf'》
- objc 禁止 deprecated 函数 警告
- 警告C4995解决办法 warning C4995: '_vsnprintf': name was marked as #pragma deprecated
- clCreateCommandQueue': was declared deprecated
- warning C4996: 'sprintf' was declared deprecated see declaration of 'sprintf'
- VS2005 出现warning C4996: strcpy was declared deprecated
- warning C4996: strcpy was declared deprecated
- Error 3 error C4996: 'cv::flann::Index_<T>': was declared deprecated c:\open
- 'fopen' was declared deprecated
- error C4996: 'avcodec_free_frame': was declared deprecated
- Visual C++ Tips: warning C4996: 'stricmp' was declared deprecated