有没有stdarg.h C中实现可变参数的便携方式?
问题描述:
我正在使用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调用约定中,前四个参数传递到寄存器中。另外,我需要我的代码具有相当的便携性。
我不知道如何做到这一点,但也许互联网有一个想法。
答
如果您删除tfp_format()
声明,您可以将<stdarg.h>
包含从标题移动到源文件。
如果这不是一种选择,我的猜测是你的运气了......
所以,你的问题是只与预处理,你不能包含'在你的代码'(但你lib可能会在内部使用它)?如果是这样,你使用'va_list'等?您可以修改头文件以使用'va_list'来排除'#include'和任何函数声明。否则,没有便携的方式。 stdarg宏在那里准确地将平台差异抽象出来。 –
mafso
2014-10-02 21:45:49
va_list仅由tinyprintf库使用。否则,代码中不会使用stdarg.h。使用某种变换器来移除使用va_list的声明的麻烦在于它打破了调用这些函数的所有地方。 – seanmk 2014-10-03 00:47:01
也许'#define tfp_format(a,b,c,d)foo(void)'在include之前? – chux 2014-10-03 01:01:52