Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;‘之前应为说明符限定符列表*’;代币;变量函数中的误差_C_Pointers_Struct - Fatal编程技术网

C &引用;‘之前应为说明符限定符列表*’;代币;变量函数中的误差

C &引用;‘之前应为说明符限定符列表*’;代币;变量函数中的误差,c,pointers,struct,C,Pointers,Struct,我正在尝试编写一个函数,用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

我正在尝试编写一个函数,用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\u io的错误
以下是
io
结构:

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

代码看起来是正确的。既然您可以声明
temp
,我看不出为什么
io\u config
会突然失败。您应该尝试什么:

  • 在函数之前的配置io下添加
    ;可能定义了宏
    配置io

  • io
    替换为
    struct\uuuu io\uuuu
    ,看看是否可以编译。如果它没有将变量声明移到
    If()
    块之外;可能您的编译器版本不支持它

  • 告诉编译器向您显示预处理的源代码(即,在所有宏都已展开之后)。也许这给了你一个暗示


  • 问题实际上在下一行中,使用
    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*
    
    这是一个有编译问题的示例。

    这是。

    旁注,您正在解除对统一化指针(
    temp
    )的引用,这是未定义的行为,可能是seg故障。您能否准确说明
    io
    是如何定义的?是否涉及宏?您的
    typedef
    可能有问题。查看一下。
    va_arg
    的第二个参数应该是一个类型<代码>*io
    不是一种类型<代码>io*是,但是。哎呀,感觉很傻。非常感谢你。