Visual C ++ _snprintf将errno设置为ERANGE

时间:2015-08-17 11:10:27

标签: c++ c++11

我刚注意到,当我的代码使用Visual C ++ 2013编译时,_snprintf函数在目标缓冲区太小时将errno设置为ERANGE(结果太大)。这似乎没有记录: https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx

我希望返回值为-1(代码也是如此),但不是任何插入errno的内容。这种行为是否适用于其他情况,是否可能是最近的变化? C ++ 11标准(我相信它添加了snprintf)对此有什么要说的吗?

2 个答案:

答案 0 :(得分:3)

  

C ++ 11标准(我相信添加了snprintf)是否有任何内容   说到这个?

是的,您描述的行为对snprintf是正确的。 在C标准之后(由C ++标准引用):

  

(7.21.6.5.3。)snprintf函数返回将要的字符数   如果n足够大,那就已经写好了   如果编码错误,则终止空字符,或负值   发生即可。因此,完全写入了以null结尾的输出   当且仅当返回的值是非负且小于n

至于errno - 函数描述没有说明,所以这适用:

  

(7.5.3。)库可以将errno的值设置为非零值   函数调用是否有错误,提供使用   errno未记录在此函数的描述中   国际标准。

答案 1 :(得分:1)

该功能符合标准。正如Tomasz所提到的,7.5.3的完整文本说“如果在函数描述中没有记录errno的使用,则可以通过库函数调用将errno的值设置为非零值,无论是否存在错误。 在此国际标准中“。 errno的使用未在标准中的sprintf描述中记录,因此库可以自由地将errno设置为非零值。无论Microsoft是否在其文档中记录了某些内容,7.5.3都