“_”的含义是什么?为什么微软在开始时添加了这个标记?为什么在msvC++中我们有_snprintf,而其他编译器允许snprintf
回答
以_
开头的全局名称空间中的标识符被保留用于实现。 _snprintf
只是实现(Visual Studio)提供的一个函数。至于其基本原理,Visual Studio实现了C89,而snprintf
是后来的C99标准的一部分。
除此之外,两种功能的语义是在返回类型,它在snprintf
始终是格式化的字符串采用(是否有在缓冲足够的空间或没有,而_snprintf
将返回字符数不同。负数如果没有在缓冲区足够的空间
也就是说,分配缓冲区只是足够大的输出,你可以这样做:
int size = snprintf(0, 0, "%s %d\n", str, i);
char * buffer = malloc(size+1);
snprintf(buffer, size+1, "%s %d\n", str, i);
你不能做到这一点与_snprintf
为上函数返回的信息是当前大小不够。
snprintf()
还没有成为微软C运行时开始支持它的标准的一部分。
由于函数原型没有标准化,并且开发人员不想使用名称snprintf
(以防标准稍后指定了不同的原型),所以他们选择添加一个前导下划线来表示该函数为Microsoft扩展到标准。
添加到上面,
有适当的C99 snprintf()
和vsnprintf()
可用,因为的Visual Studio 2015年
,他们甚至不触发众所周知的不安全功能弃用警告。
_snprintf_s()
或_vsnprintf_s()
,而提供,是的MSVC专用功能“安全变体”,与非C99行为。
除了在缓冲区不够大的情况下的不同返回值(在David的回答中描述)之外,来自_sn...
组的功能与标准snprintf
在另一个重要方面有所不同。如果目标缓冲区是一个字符太短,该_sn...
功能考虑这种情况下“成功”。
更详细地,如果目标缓冲器是足够长,以在整个得到的序列存储但没有终止零字符,所述_sn...
函数不截断的结果,不写终止零到目标缓冲器和作为结果返回缓冲区的大小。所以,通常情况下,结果不能保证以零终止。
在相同的情况下,snprintf
将丢弃所产生的序列的最后一个字符和写在其位0终结。 snprintf
的结果始终为零终止。
- 1. 为什么编译器在C++中允许vector.begin()= vector.end()?
- 2. 为什么VC++ 2010允许它编译?
- 3. 为什么Visual Studio不允许我编译这个Bresenham代码?
- 4. 为什么我们需要允许接口只从java.lang.Object中扩展而不是其他类?
- 5. 编译器允许'char * k = false'?为什么?
- 6. 为什么编译器允许缩小转换范围
- 7. 为什么没有其他构造函数被允许?
- 8. 为什么这个C++代码会与某些编译器一起编译而不是其他编译器?
- 9. 等价于其他编译器中MSVC的_countof?
- 10. 异常允许我们分开什么?
- 11. 为什么跨站API调用允许一些API但不允许其他人
- 12. 为什么Java编译器有时会允许对null进行拆箱?
- 13. 为什么我们允许在java中拥有最终的主要方法?
- 14. 为什么GWT有时会成功编译,而其他时间只是失速?
- 15. 为什么我的代码在x64中编译而不是在x32中编译?
- 16. 为什么打字稿编译犯规允许返回类
- 17. 为什么我的comboBox只显示其中一个值而灰显,并且不允许它们被选中?
- 18. 为什么在MSVC
- 19. 为什么我们需要在Java中编译时间常量?
- 20. 为什么MSVC编译器没有检测到std :: array出边界访问
- 21. MSVC编译器行为是用来
- 22. 从其他fortran编译器中区分ifort的宏是什么?
- 23. 什么是Xcode5中的“其他故事板编译器标志”
- 24. MSVC编译器更新
- 25. MSVC++编译器错误C2892?
- 26. 使MSVC编译器GCC complient?
- 27. 什么PHP CMS将允许我有多个级别的用户可以关注其他用户并发布在他们的“墙上”。有什么建议么?
- 28. 在其他库中编译器警告
- 29. Boost 1.37为MSVC预编译
- 30. 为什么我们在编写编译器时需要运行时库?