我需要将snprintf()移植到另一个不完全支持GLibC的平台上。
我正在寻找Glibc 2.14源代码中的基础声明。我遵循许多函数调用,但卡在vfprintf()上。然后它似乎调用_IO_vfprintf(),但我找不到定义。可能一个宏正在混淆事物。
我需要查看扫描格式字符串的真实C代码,并计算输入缓冲区足够大时它将写入的字节数。
我也尝试过查看newlib 1.19.0,但我遇到了_svfprintf_r()。我无法在任何地方找到这个定义。
有人可以指向我的定义或另一个定义snprintf()吗?
答案 0 :(得分:5)
我花了很长时间挖掘源代码,在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)
{
...
答案 1 :(得分:5)
GNU C库(glibc)的源代码托管在sourceware.org上。
以下是vfprintf()
实施的链接,由snprintf()
调用:
https://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c
答案 2 :(得分:4)
http://www.ijs.si/software/snprintf/他们声称是 snprintf的可移植实现,包括vsnprintf.c,asnprintf,vasnprintf,asprintf,vasprintf 。也许它可以提供帮助。