“_”的含义是什么?为什么微软在开始时添加了这个标记?为什么在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. 为什么没有其他构造函数被允许?
- 5. 为什么这个C++代码会与某些编译器一起编译而不是其他编译器?
- 6. 等价于其他编译器中MSVC的_countof?
- 7. 为什么跨站API调用允许一些API但不允许其他人
- 8. 为什么Java编译器有时会允许对null进行拆箱?
- 9. 为什么我们允许在java中拥有最终的主要方法?
- 10. 为什么GWT有时会成功编译,而其他时间只是失速?
- 11. 为什么我的代码在x64中编译而不是在x32中编译?
- 12. 为什么打字稿编译犯规允许返回类
- 13. 为什么MSVC编译器没有检测到std :: array出边界访问
- 14. 从其他fortran编译器中区分ifort的宏是什么?
- 15. 在其他库中编译器警告
- 16. MSVC编译器更新
- 17. 使MSVC编译器GCC complient?
- 18. 为什么我们在编写编译器时需要运行时库?
- 19. 为什么C#/ VB.NET编译器不允许派生自System.MulticastDelegate的类?
- 20. Boost 1.37为MSVC预编译
- 21. 为什么字符串是允许的并且int int不被编译器允许?
- 22. 为什么PHP允许从其他实例调用私有方法?
- 23. GWT编译器优化:他们什么时候安全?
- 24. C - 为什么我允许这样做?
- 25. 为什么我们需要在编译器中分配存储空间
- 26. 为什么我的编译器无法将其转换?
- 27. 为什么浏览器允许CSRF?
- 28. Flash编译器不允许覆盖
- 29. 此编译器转换是否允许?
- 30. 编译为其他平台