va_arg(argp,float)崩溃了

时间:2012-11-29 13:52:05

标签: c avr-gcc

我正在尝试编写自定义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的原因。

1 个答案:

答案 0 :(得分:3)

当您在变量参数列表中传递float时,它会被编译器隐式提升为double。因此,您必须使用va_arg(argp, double)从变量参数列表中获取它。

当你尝试将参数作为float获取时,那么

  

type与实际的下一个参数的类型不兼容(正如提升的那样)   到默认参数升级)[和]行为是未定义的

(标准§7.16.1.1,va_arg宏。根据§6.2.7,floatdouble不兼容。)