您的位置:首页 > 编程语言 > PHP开发

_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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: