我刚注意到,当我的代码使用Visual C ++ 2013编译时,_snprintf函数在目标缓冲区太小时将errno设置为ERANGE(结果太大)。这似乎没有记录: https://msdn.microsoft.com/en-us/library/2ts7cx93.aspx
我希望返回值为-1(代码也是如此),但不是任何插入errno的内容。这种行为是否适用于其他情况,是否可能是最近的变化? C ++ 11标准(我相信它添加了snprintf)对此有什么要说的吗?
答案 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都
。