头文件中的struct decleration中的错误

时间:2016-10-21 13:35:00

标签: c

port_pin.h

#ifndef __PORT_PIN_H__
#define __PORT_PIN_H__

typedef enum
{
    IO_PORT_A    = ((uint16_t)0),   /* IO Port A Selected  */
    IO_PORT_B    = ((uint16_t)1),   /* IO Port B Selected  */
    IO_PORT_NONE = ((uint16_t)0xFF)  /* No IO Port Selected */
}PortName_t;

/* IO Driver GPIO Pin Numbers */
typedef enum
{
    IO_PIN_0    = ((uint16_t)0),      /* Pin 0 selected    */
    IO_PIN_1    = ((uint16_t)1),      /* Pin 1 selected    */
    IO_PIN_2    = ((uint16_t)2),      /* Pin 2 selected    */
    IO_PIN_3    = ((uint16_t)3),      /* Pin 3 selected    */
}PinNumber_t;

hal_io.h

#ifndef __HAL_IO_H__
#define __HAL_IO_H__

#ifdef  DEF_HAL_IO
#define EXTERN_HAL_IO
#else   
#define EXTERN_HAL_IO extern
#endif

EXTERN_HAL_IO void HalIo_fct(PortName_t, PinNumber_t);

#endif

drv_io.h

#ifndef __DRV_IO_H__
#define __DRV_IO_H__

#ifdef  DEF_DRV_IO
#define EXTERN_DRV_IO
#else   
#define EXTERN_DRV_IO extern
#endif

EXTERN_DRV_IO Status_t DDrvIOPinSet_fct(const BoardCfgPortPin_t *pointer);

#endif

board_cfg.h

#ifndef __BOARD_CFG_H__
#define __BOARD_CFG_H__

#ifdef  DEF_BOARD_CFG
#define EXTERN_BOARD_CFG
#else   
#define EXTERN_BOARD_CFG extern
#endif

/* IO driver Gpio Port and Pin Configuration */
typedef struct
{
    PortName_t  Name_en;    /* Specifies the IO Port module             */
                            /* This parameter can be a value of @ref    */
                            /* GpioPort_t                               */

    PinNumber_t PinNo_en;   /* Specifies the IO Pin number              */
                            /* This parameter can be a value of @ref    */
                            /* PinNumber_t                              */
}BoardCfgPortPin_t;

EXTERN_BOARD_CFG const BoardCfgPortPin_t BoardCfgPortPin_sta[4];

EXTERN_BOARD_CFG void BoardCfg_fct();

#endif

的main.c

#include <stdio.h>
#include "common.h"
#include "port_pin.h"
#include "board_cfg.h"
#include "drv_io.h"

int main()
{
    BoardCfg_fct();

    printf("\n\n");

    return 0;
}

hal_io.c

#define DEF_HAL_IO

#include <stdio.h>
#include "common.h"
#include "port_pin.h"
#include "hal_io.h"

void HalIo_fct(PortName_t PortName_en, PinNumber_t PinNo_en)
{
    printf("\nIN HAL\n");
    printf("PORTNAME : %d, PIN NUMBER : %d", PortName_en, PinNo_en);
}

drv_io.c

#define DEF_DRV_IO

#include <stdio.h>
#include "common.h"
#include "port_pin.h"
#include "hal_io.h"
#include "board_cfg.h"
#include "drv_io.h"

Status_t DDrvIOPinSet_fct(const BoardCfgPortPin_t *pointer)
{
    printf("\nin DRV IO \n");
    HalIo_fct(pointer->Name_en, pointer->PinNo_en);
    return (PASS);
}

board_cfg.c

#define DEF_BOARD_CFG

#include <stdio.h>
#include "common.h"
#include "port_pin.h"
#include "drv_io.h"
#include "board_cfg.h"

const BoardCfgPortPin_t BoardCfgPortPin_sta[4] =
{
    { IO_PORT_B, IO_PIN_0 }, /* SENSE_INV_TEMP        */
    { IO_PORT_B, IO_PIN_1 }, /* SENSE_INV_AC          */
    { IO_PORT_B, IO_PIN_2 }, /* BUZZER                */
    { IO_PORT_B, IO_PIN_3 }, /* STAUS_230V_AC         */
};

void BoardCfg_fct()
{
    DDrvIOPinSet_fct(&BoardCfgPortPin_sta[0]);
    DDrvIOPinSet_fct(&BoardCfgPortPin_sta[1]);
    DDrvIOPinSet_fct(&BoardCfgPortPin_sta[2]);
    DDrvIOPinSet_fct(&BoardCfgPortPin_sta[3]);
}

关于上述文件,当我尝试编译代码时,我收到以下错误:

  

drv_io.h(10):错误C2143:语法错误:丢失&#39;)&#39;之前&#39; *&#39;

     

drv_io.h(10):错误C2143:语法错误:缺失&#39; {&#39;之前&#39; *&#39;

     

drv_io.h(10):错误C2059:语法错误:&#39;)&#39;

如果我在board_cfg.h中注释代码

/* IO driver Gpio Port and Pin Configuration */
typedef struct
{
    PortName_t  Name_en;    /* Specifies the IO Port module             */
                            /* This parameter can be a value of @ref    */
                            /* GpioPort_t                               */

    PinNumber_t PinNo_en;   /* Specifies the IO Pin number              */
                            /* This parameter can be a value of @ref    */
                           /* PinNumber_t                              */
}BoardCfgPortPin_t;

并将其添加到port_pin.h,我可以成功编译代码。

但我需要在board_cfg.h中只有

的结构

为什么我收到此错误?

2 个答案:

答案 0 :(得分:3)

在文件board_cfg.c中,首先是drv_io.h,然后是board_cfg.h。但是,DDrvIOPinSet_fct的延迟有一个类型为BoardCfgPortPin_t的参数,该参数在board_cfg.h中定义。由于首先列出drv_io.h,因此尚未声明BoardCfgPortPin_t。这就是造成错误的原因。

您的标头文件相互依赖。每个头文件都需要包含它们所依赖的其他头文件,而不是依赖于包含它们的文件来按顺序排列。

  • 在port_pin.h中,添加#include <stdint.h>
  • 在hal_io.h中,添加#include "port_pin.h"
  • 在drv_io.h中,添加#include "board_cfg.h"#include "common.h"
  • 在board_cfg.h中添加#include "port_pin.h"

通过这样做,每个标题都包含它所需的一切。然后,源文件包含它们的顺序无关紧要。

此外,您不需要与extern相关的任何定义。默认情况下,函数声明为extern

答案 1 :(得分:1)

在drv_io.h的第10行,你有

EXTERN_DRV_IO Status_t DDrvIOPinSet_fct(const BoardCfgPortPin_t *pointer);

所以你使用的是BoardCfgPortPin_t,这意味着编译器必须知道BoardCfgPortPin_t是什么。有几种方法可以实现这一目标:

    在第10行之前的drv_io.h中
  • #include board_cfg.h
  • 使用前瞻声明:将typedef struct BoardCfgPortPin_t;放在第10行
  • 之前
  • 确保所有.c文件在drv_io.h之前包含board_cfg.h;除了board_cfg.c
  • 以外的所有情况都是如此