3

我正在尝试编写一个函数,它将在 C 中配置微控制器的外围设备。为此,我使用了va_arg. 这是功能:

void init_peripheral(int ID, ...){
    va_list device;
    va_start(device, ID);
    io * temp; // No error here
            //io is a structure 
            //IO, USART, LCD are 01, 02, 03.
    (*temp).portB.set = set_portB;

    if( ID == IO ){
        io* config_io; // error:expected specifier-qualifier-list before ‘*’ token
        config_io = va_arg(device, *io);
        (*config_io).portB.set = set_portB;
        (*config_io).portB.clr = clr_portB;
        (*config_io).portB.mkin = mkin_portB;
        (*config_io).portB.mkout = mkout_portB;

        (*config_io).portC.set = set_portC;
        (*config_io).portC.clr = clr_portC;
        (*config_io).portC.mkin = mkin_portC;
        (*config_io).portC.mkout = mkout_portC;

        (*config_io).portD.set = set_portD;
        (*config_io).portD.clr = clr_portD;
        (*config_io).portD.mkin = mkin_portD;
        (*config_io).portD.mkout = mkout_portD;
    }

    else if( ID == LCD ){       
        lcd *config_lcd;
        config_lcd = va_arg(device, *lcd);
         //Set necessary params here
    }

    else if( ID == USART){
        usart *config_usart;
        config_usart = va_arg(device, *usart);
        (*config_usart).init = usart_init;
        (*config_usart).transmit = usart_transmit;
        (*config_usart).receive = usart_receive;
    }


    va_end(device);
}

我没有收到该行的错误io * temp,但我确实收到了一个错误io * config_io;
Here is the iostruct:

struct __io__{
    struct __port__ portB;
    struct __port__ portC;
    struct __port__ portD;
};
typedef struct __io__ io;
4

2 回答 2

3

问题实际上在下一行,与va_arg宏有关。您发送的是取消引用的指针而不是类型:

config_io = va_arg(device, *io);       // Should be io*

config_lcd = va_arg(device, *lcd);     // Should be lcd*

config_usart = va_arg(device, *usart); // Should be usart*

这是你的代码,它有编译问题。
这是固定版本

于 2012-07-09T13:34:03.550 回答
1

代码看起来正确。而且既然你可以声明temp,我看不出为什么io_config会突然失败。你应该尝试什么:

  1. 在函数前添加#under config_io;也许config_io定义了一个宏。

  2. 替换iostruct __io__只是看看是否会编译。如果它没有将变量声明移到if()块外;也许您的编译器版本不支持它。

  3. 告诉编译器向您展示预处理的源代码(即在所有宏都被扩展之后)。也许这会给你一个提示。

于 2012-07-09T13:26:57.473 回答