2014-10-02 12 views
1

我正在使用C编写的现有代码库,它正在使用GCC编译为arm7tdmi目标。这是嵌入式代码,在目标系统上运行时没有操作系统。有没有stdarg.h C中实现可变参数的便携方式?

我遇到的问题是代码使用奇妙的GPL'd embedded printf library, written by Kustaa Nyholm,它使用stdarg.h作为变长参数。没有进入太多细节,这是我需要使用的商业预处理工具导致的错误。

这基本上是tinyprintf头:

#include <stdarg.h> 

void init_printf(void* putp,void (*putf) (void*,char)); 
void tfp_printf(char *fmt, ...); 
void tfp_sprintf(char* s,char *fmt, ...); 
void tfp_format(void* putp,void (*putf) (void*,char),char *fmt, va_list va); 

当然,sprintf的/ printf的工作具有可变的参数,他们需要的方式。我想知道的是,如果有一种方法可以在不使用stdharg.h和va_list的情况下实现这一点。或者更重要的是,如果有一种方法可以在C中实现可变参数而不需要stdarg.h。

This solution对我不起作用,因为我正在使用ARM目标。在arm7调用约定中,前四个参数传递到寄存器中。另外,我需要我的代码具有相当的便携性。

我不知道如何做到这一点,但也许互联网有一个想法。

+1

所以,你的问题是只与预处理,你不能包含'在你的代码'(但你lib可能会在内部使用它)?如果是这样,你使用'va_list'等?您可以修改头文件以使用'va_list'来排除'#include'和任何函数声明。否则,没有便携的方式。 stdarg宏在那里准确地将平台差异抽象出来。 – mafso 2014-10-02 21:45:49

+0

va_list仅由tinyprintf库使用。否则,代码中不会使用stdarg.h。使用某种变换器来移除使用va_list的声明的麻烦在于它打破了调用这些函数的所有地方。 – seanmk 2014-10-03 00:47:01

+0

也许'#define tfp_format(a,b,c,d)foo(void)'在include之前? – chux 2014-10-03 01:01:52

回答

0

如果您删除tfp_format()声明,您可以将<stdarg.h>包含从标题移动到源文件。

如果这不是一种选择,我的猜测是你的运气了......