微软_stprintf警告

时间:2009-08-18 13:34:57

标签: c++ visual-c++ printf

为什么我会收到以下代码的以下警告:)

代码:

_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中的那个?

5 个答案:

答案 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" );