Visual C++ _snprintf setting errno to ERANGE

Visual C++ _snprintf setting errno to ERANGE

本文关键字:errno to ERANGE setting snprintf C++ Visual      更新时间:2023-10-16

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

我期望返回值为-1(代码也是如此),但不希望对errno进行任何干预。这种行为是否在其他地方有记录,是否可能是最近的更改?c++ 11标准(我相信它增加了snprintf)对此有什么要说的吗?

c++ 11标准(我相信它增加了snprintf)有什么吗怎么说呢?

是的,你所描述的行为对于snprintf是正确的。C标准之后(参照c++标准):

(7.21.6.5.3)。snprintf函数返回需要的字符数n是否足够大,不包括终止空字符,,如果编码错误则为负值发生。因此,以空结束的输出已经完全写入当且仅当返回值非负且小于n

对于errno -函数描述中没有提到它,所以这适用于:

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

功能符合标准。正如Tomasz所提到的,7.5.3的完整文本说"无论是否有错误,只要在本国际标准的函数的描述中没有记录errno的使用,errno的值都可以被库函数调用设置为非零"。标准中sprintf的描述中没有记录errno的使用,因此库可以自由地将errno设置为非零值。无论微软是否在他们的文档中记录了一些东西,不是7.5.3所涵盖的