我目前正在将我们的一个 Linux 库的代码转换为 Windows DLL。

在这个库中,我有一个函数,它以 printf 方式(格式字符串,
然后省略号)。在这个函数中,我使用 vsnprintf 来格式化提供的参数。
因为我想知道是否可以将最终字符串塞入一个小缓冲区中,或者是否必须分配
内存,我有兴趣确定格式化字符串的“长度”。

为此,我目前正在使用这样的 vsnprintf(显然是编写示例代码):

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

void foo(const char* fmt, ...)
{
   int len = 0;
   va_list ap;

   va_start(ap, fmt);
   len = vsnprintf(0, 0, fmt, ap);
   printf("len = %d\n", len);
   va_end(ap);
}

int main(void)
{
   foo("12345%s", "67890");
   exit(0);
}

Open Group Base Specifications Issue 6 涵盖了这种用法:



当我在 Windows 系统(Visual Studio 2010)上使用/analyze 编译此代码时出现了问题。编译器/分析器给了我以下信息:



快速浏览一下 MSDN entry for vsnprintf 给了我这个:



奇怪的是,上面的示例仍然“按预期”在 Windows 上工作(即它返回给我将写入的字符数)。

但是由于我不希望这依赖于未指定的东西,我想知道是否有更好的官方方法来实现相同的目标,而不必希望这不会在将来的某个版本中中断。

谢谢你的时间!

最佳答案

Hans Passant 在评论中提供的答案:
记录在案的 _vscprintf 在 Windows 上提供了此功能,
因此,没有必要依赖“未指定的行为”。

关于c - Unix 到 Windows : Alternative to vsnprintf to determine length?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8488671/

10-17 02:47