独立的便携式snprintf(),独立于标准库?

时间:2013-10-16 20:06:47

标签: c embedded cross-platform portability printf

我正在为NO C-runtime的目标平台编写代码。 No stdlibno stdio。我需要像snprintf这样的字符串格式化函数,但它应该是able to run without any dependencies,甚至不是C库。

最多可以取决于我提供的memory alloc functions

我签出了Trio,但需要stdio.h header。我不能用这个。

修改

目标平台:PowerPC64 home made OS(不是我)。但是,库不应该依赖于操作系统特定的东西。

EDIT2

我已尝试过一些第三方开源库,例如Trio(http://daniel.haxx.se/projects/trio/),snprintf和miniformat(https://bitbucket.org/jj1/miniformat/src),但它们都依赖于string.h,stdio等标题。 h,或者(甚至更糟)stdlib.h。如果已经存在,我不想编写自己的实现,因为这会耗费时间并且容易出错。

3 个答案:

答案 0 :(得分:7)

尝试使用uclibc的snprintf实现。这可能具有最少的依赖性。一些挖掘表明snprintf是用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 :(得分:2)

您可能至少需要stdarg.h或对特定编译器/体系结构调用约定的低级知识,以便能够处理可变参数。

我一直在使用基于Kustaa Nyholm's implementation的代码。它提供printf()(使用用户提供的字符输出存根)和sprintf(),但添加snprintf()就足够了。我在我的实现中添加了vprintf()vsprintf()

不需要动态内存应用程序,但它确实依赖于stdarg.h,但正如我所说,如果没有任何可变参数函数,你不可能逃脱 - 尽管你可能会实现自己的。

答案 2 :(得分:0)

我猜你在规范的环境中需要明确记录和验证COTS代码。

但是,我认为在stdarg.h的情况下,这是值得的。您可以直接获取源代码并将其视为手写代码(评论,lint,单元测试等)。任何自编的替代品都会有很多工作,可能不太稳定,绝对不便携。

也就是说,实际的snprintf实现应该不会太难,你可以自己做。特别是如果您可以剥离一些功能。

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