【问题标题】:Looking for C source code for snprintf()寻找 snprintf() 的 C 源代码
【发布时间】:2011-06-15 10:12:44
【问题描述】:

我需要将 snprintf() 移植到另一个不完全支持 GLibC 的平台。

我正在寻找 Glibc 2.14 源代码中的底层声明。我遵循了许多函数调用,但卡在 vfprintf() 上。然后它似乎调用了_IO_vfprintf(),但我找不到定义。可能是一个宏在混淆事物。

我需要查看真正的 C 代码,它扫描格式字符串并计算如果输入缓冲区足够大时它将写入的字节数。

我也尝试查看 newlib 1.19.0,但我卡在了 _svfprintf_r() 上。我在任何地方都找不到定义。

有人可以指出 snprintf() 的定义或另一个定义吗?

【问题讨论】:

    标签: glibc printf newlib


    【解决方案1】:

    我花了很长时间挖掘资源以在 Newlib 中找到 _svfprintf_r()(和朋友)定义。既然 OP 提出了这个问题,我会把我的发现发布给那些也需要这些的可怜的灵魂。以下适用于 Newlib 1.20.0,但我猜它在不同版本之间或多或少是相同的。

    实际来源位于 vfprintf.c 文件中。有一个宏_VFPRINTF_R 设置为_svfiprintf_r_vfiprintf_r_svfprintf_r_vfprintf_r 之一(取决于构建选项),然后相应地定义实际实现函数:

    int
    _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap),
           struct _reent *data _AND
           FILE * fp           _AND
           _CONST char *fmt0   _AND
           va_list ap)
    {
        ...
    

    【讨论】:

      【解决方案2】:

      http://www.ijs.si/software/snprintf/ 拥有他们声称的snprintf 的可移植实现,包括 vsnprintf.c、asnprintf、vasnprintf、asprintf、vasprintf。也许它可以提供帮助。

      【讨论】:

      • 不管看起来多么好,这个实现不支持任何浮点/双精度格式,所以还远未完成。
      【解决方案3】:

      GNU C 库 (glibc) 的源代码托管在 sourceware.org

      这里是vfprintf()的实现链接,由snprintf()调用: https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c

      【讨论】:

      • 我检查了您提供的网址。我看到了:#ifndef COMPILE_WPRINTF ... # define vfprintf _IO_vfprintf_internal,但是_IO_vfprintf_internal 是在哪里定义的?如果我误解了,请告诉我。
      • vfprintf()的定义从line 1235开始。
      • vfprintf() 现在从 line 1244 开始。
      • JUMPs 很多!
      猜你喜欢
      • 2011-05-01
      • 2018-10-18
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多