不依赖标准库的独立可移植snprintf()函数?

7
我正在为一个目标平台编写代码,该平台没有C运行时环境没有stdlib没有stdio。我需要一个字符串格式化函数,类似于snprintf,但应该能够在没有任何依赖项的情况下运行,甚至不需要C库。
最多只能依赖于我提供的内存分配函数
我查看了Trio,但它需要stdio.h头文件。我不能使用这个。 编辑 目标平台:PowerPC64自制操作系统(不是由我制作)。但是库不应依赖于特定于操作系统的内容。 编辑2

我尝试过一些第三方开源库,比如Trio(http://daniel.haxx.se/projects/trio/),snprintf和miniformat(https://bitbucket.org/jj1/miniformat/src),但它们都依赖于像string.h、stdio.h或(更糟糕的是)stdlib.h这样的头文件。如果已经存在一个实现,我不想编写自己的实现,因为那会浪费时间并容易出错。


要求我们推荐或寻找工具、库或喜爱的离线资源的问题,因为它们往往会吸引有主观见解的答案和垃圾邮件,所以在 Stack Overflow 上是不被允许的。相反,请描述问题以及已经采取的解决方案。 - Jens Gustedt
你们打算如何支持I18N需求?这需要大量的工作。如果不能使用<stdarg.h>,那就会有很大的问题(或者您需要模拟它,这通常并不容易)。您的代码需要多具备可移植性?内存分配函数的名称和接口是什么?等等。 - Jonathan Leffler
很显然,你需要 <stdarg.h>,至于其余部分,你可以修改任何一个自由的 snprintf 实现。你只需要将库调用映射到你自己的平台相关函数即可。 - jeb
关于Trio(或任何其他实现),请删除stdio.h的包含并修复出现的问题,我无法想象依赖性如此强大 - 它甚至可能仅用于标准原型声明。 - Clifford
1
snprintf() 的可移植实现实际上很简单:int snprintf(char *buffer, size_t buflen, char const *fmt, ...) { va_list args; va_start(args, fmt); int rv = vsnprintf(buffer, buflen, fmt, args); va_end(args); return rv; } 但这只是将痛苦推迟到编写 vsnprintf() 上(这就是为什么这是一条注释而不是答案)。然而,这是一个很好的建议;用接受 va_list 的函数(如 vsnprintf())来编写可变参数函数(如 snprintf())。同时公开两个接口。 - Jonathan Leffler
3个回答

7
尝试使用来自uclibc的snprintf实现。这可能具有最少的依赖关系。稍微挖掘一下,可以发现snprintf是基于vsnprintf实现的,而vsnprintf又是基于vfprintf(奇怪的是)实现的,它使用一个假的“流”来写入字符串。
这是指向代码的指针:http://git.uclibc.org/uClibc/tree/libc/stdio/_vfprintf.c 此外,快速谷歌搜索还找到了这个: 希望其中一个适合您的目的。这可能不是完整的列表。
这里有一个不同的列表: http://trac.eggheads.org/browser/trunk/src/compat/README.snprintf?rev=197

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Qix - MONICA WAS MISTREATED

2
您可能至少需要使用 stdarg.h 或具有特定编译器/架构调用约定的低级知识,才能够处理可变参数。
我一直在使用基于 Kustaa Nyholm 的实现 的代码。它提供了 printf()(带有用户提供的字符输出存根)和 sprintf(),但添加 snprintf() 就足够简单了。例如,在我的实现中,我添加了 vprintf()vsprintf()
不需要动态内存应用程序,但是它确实依赖于 stdarg.h,但正如我所说,您不太可能在任何可变函数中获得免除这种依赖的方法,尽管您可以潜在地实现自己的方法。

0

我猜你处于需要显式记录和验证COTS代码的规范环境中。

然而,在stdarg.h的情况下,我认为这是值得的。您可以只拉取此源代码,并将其视为手写代码(审查、lint、单元测试等)。任何自编写的替代品都会是很多工作量,可能不太稳定,并且绝对不具备可移植性。

也就是说,实际的snprintf实现不应该太难,您可能可以亲自完成这项工作,特别是如果您能够削减一些功能。

请记住,vararg代码没有类型检查,容易出错。对于库snprintf,您可能会发现gcc的警告很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接