我正在尝试编写自定义printf函数。
void debug_print(const char *fmt, ...)
{
const char *p;
va_list argp;
int i;
double f;
char *s;
char fmtbuf[80];
va_start(argp, fmt);
for(p = fmt; *p != '\0'; p++)
{
if(*p != '%')
{
uart_putchar(*p);
continue;
}
switch(*++p)
{
case 'c':
...
break;
case 'f':
f = va_arg(argp, float); // ??????
s = dtostrf(f, 10, 6, fmtbuf);
uart_puts(s);
break;
...
// then in the main part of the program
debug_print("%f", 123.456);
当程序到达f = va_arg(argp,float)时,它永远不会从该行返回。如果我将其更改为f = va_arg(argp,double),则返回0.
尝试使用设备(ATMega328P)和Atmel Studio 6模拟器,结果相同。
听起来像链接器选项有什么用?
更新
现在只需找出va_arg(argp, double)
返回0的原因。
答案 0 :(得分:3)
当您在变量参数列表中传递float
时,它会被编译器隐式提升为double
。因此,您必须使用va_arg(argp, double)
从变量参数列表中获取它。
当你尝试将参数作为float
获取时,那么
type
与实际的下一个参数的类型不兼容(正如提升的那样) 到默认参数升级)[和]行为是未定义的
(标准§7.16.1.1,va_arg
宏。根据§6.2.7,float
和double
不兼容。)