有没有一种可移植的方法来实现C中的可变参数,而不使用stdarg.h?

有没有一种可移植的方法来实现C中的可变参数,而不使用stdarg.h?,c,embedded,printf,variadic-functions,C,Embedded,Printf,Variadic Functions,我正在使用C编写的现有代码库,该代码库正在使用GCC为arm7tdmi目标编译。这是嵌入式代码,在目标系统上没有操作系统的情况下运行 我遇到的问题是,代码使用了fantastic,它使用stdarg.h作为可变长度参数。在不涉及太多细节的情况下,这会导致我需要使用的商业预处理工具出现错误 这基本上就是tinyprintf标题: #include <stdarg.h> void init_printf(void* putp,void (*putf) (void*,char)); vo

我正在使用C编写的现有代码库,该代码库正在使用GCC为arm7tdmi目标编译。这是嵌入式代码,在目标系统上没有操作系统的情况下运行

我遇到的问题是,代码使用了fantastic,它使用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

对我不起作用,因为我用的是手臂靶子。在arm7调用约定中,前四个参数在寄存器中传递。此外,我需要我的代码是相当可移植的

我不知道有什么方法可以做到这一点,但也许互联网有办法。

如果删除tfp_格式声明,可以将包含内容从标题移动到源文件


如果这不是一个选项,我猜你可能运气不好…

那么,你的问题只是预处理器,你不能在代码中包含它,但你的库可能会在内部使用它?如果是,您是否使用va_列表等。?您可以使用va_列表修改标题以排除包含和任何函数声明。否则,就没有可移植的方法。stdarg宏正好用于提取平台差异。va_列表仅由tinyprintf库使用。否则,代码中没有stdarg.h的用法。使用某种转换器来删除使用va_列表的声明的问题在于,它会中断调用这些函数的所有位置,我不认为你会得到一个好的答案,而且几乎肯定不是一个可移植的答案,除非你描述了商业预处理工具造成的问题。也就是说,如果您对printf库的使用相当有限,那么您可以使用“重载”,它采用特定的参数组合,而不是变量参数列表。例如,tfp_printf_ichar*fmt,int i;和tfp_printf_sichar*fmt,char const*s,int i;等等这是可行的,但很快就会变得乏味…@MichaelBurr这不是个坏主意,但我也可以将其简化为一个函数,只接受数组指针和长度作为参数。我想我的问题更具探索性。我想知道是否有一种更鬼鬼祟祟的方式来做这件事,我只是没有想过。