为什么在msvc ++中我们有_snprintf而其他编译器允许使用snprintf

vic*_*ico 11 c++ printf visual-c++

"_"是什么意思?为什么微软在一开始就添加这个标记?

Dav*_*eas 18

开头的全局命名空间中的标识符_保留用于实现._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 );
Run Code Online (Sandbox Code Playgroud)

您不能这样做,_snprintf因为函数返回的唯一信息是当前大小不够.


Fré*_*idi 11

snprintf() 当微软的C运行时开始支持它时,它还不是标准的一部分.

由于函数原型未标准化,并且开发人员不想使用该名称snprintf(如果标准稍后指定了不同的原型),他们选择添加前导下划线以将该函数表示为该标准的Microsoft扩展.