2009-08-18 76 views
6

为什么我得到了下面的代码:)以下警告微软_stprintf警告

代码:

_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。

b/w _xxx和xxx函数有什么区别?

编辑:

好有用于_stprintf的Unicode版本,包含哪一个两个定义?

tchar.h或strsafe.h中的那个?

+0

你是询问_stprintf或_strprintf,还是什么?请修改您的问题以保持一致。 – 2009-08-18 13:44:04

+0

我在问_stprintf,那是一个错字 – akif 2009-08-18 13:49:40

回答

5

http://msdn.microsoft.com/en-us/library/ybk95axf%28VS.80%29.aspx

的swprintf是的sprintf的宽字符版本; swprintf的指针参数是宽字符字符串。检测swprintf中的编码错误可能与sprintf中的错误不同。 swprintf和fwprintf的行为相同,除了swprintf将输出写入字符串而不是写入FILE类型的目标,并且swprintf需要count参数来指定要写入的最大字符数。具有_l后缀的这些函数的版本是相同的,只不过它们使用传入的locale参数而不是当前的线程语言环境。

在Visual C++ 2005中,swprintf符合ISO C标准,该标准要求第二个参数count为size_t类型。要强制使用旧的非标准行为,请定义_CRT_NON_CONFORMING_SWPRINTFS。在将来的版本中,旧行为可能会被删除,因此应该更改代码以使用新的一致行为。

+0

为什么它会发出警告呢? – akif 2009-08-18 13:50:11

+3

这个警告没有解释吗?因为他们改变了行为。人们通常喜欢知道代码何时不符合他们的期望。 ;) – jalf 2009-08-18 13:57:46

0

微软提供了它自己的CRT _swprintf的分机 - 不是(例如)用UNIX

0

微软(用于?)前缀兼容所没有的C标准的一部分,否则广泛可用的非Win32函数与下划线。

+0

好吧_stprintf的UNICODE版本有两个定义,哪一个是包含的? tchar.h或strsafe.h中的那个? – akif 2009-08-18 14:23:02

1

也许这样?

_stprintf(m_szFileNamePath, 256, _T("%s"), strFileName); 
0

这应该工作

int len = swprintf(buf, 100, L"%s", L"Hello world");