为什么我会收到以下代码的以下警告:)
代码:
_stprintf(m_szFileNamePath,_T("%s"),strFileName);
警告C4996:'_ swprintf':swprintf已更改为符合ISO C标准,添加了额外的字符计数参数。要使用传统的Microsoft swprintf,请设置_CRT_NON_CONFORMING_SWPRINTFS。
我知道_strprintf是一个宏,如果定义_UNICODE将评估为_swprintf,否则它将是sprintf。
现在这是什么_swprintf。有一个函数swprintf,但为什么_stprintf评估为_swprintf而不是swprintf。
_xxx和xxx功能的区别是什么?
修改
好的,_stprintf的UNICODE版本有两个定义,其中包含一个?
tchar.h或strsafe.h中的那个?
答案 0 :(得分:5)
http://msdn.microsoft.com/en-us/library/ybk95axf%28VS.80%29.aspx
swprintf是sprintf的宽字符版本; swprintf的指针参数是宽字符串。 swprintf中的编码错误检测可能与sprintf中的不同。除了swprintf将输出写入字符串而不是FILE类型的目标之外,swprintf和fwprintf的行为相同,并且swprintf要求count参数指定要写入的最大字符数。带有_l后缀的这些函数的版本是相同的,除了它们使用传入的locale参数而不是当前线程区域设置。
在Visual C ++ 2005中,swprintf符合ISO C标准,该标准需要第二个参数count,类型为size_t。要强制执行旧的非标准行为,请定义_CRT_NON_CONFORMING_SWPRINTFS。在将来的版本中,可能会删除旧行为,因此应更改代码以使用新的符合行为。
答案 1 :(得分:1)
也许这个?
_stprintf(m_szFileNamePath, 256, _T("%s"), strFileName);
答案 2 :(得分:0)
Microsoft提供了自己的CRT _swprintf扩展 - 与unix不兼容(例如)
答案 3 :(得分:0)
Microsoft(以前用于?)前缀广泛使用的非win32函数,这些函数不属于带有下划线的C标准。
答案 4 :(得分:0)
这应该有效
int len = swprintf( buf, 100, L"%s", L"Hello world" );