头文件中的C Typedef枚举成员未在源文件中定义

时间:2018-11-21 11:08:20

标签: c enums typedef member

可能是一个非常基本的问题,但这使我非常困惑。

应用

我正在编写I2C硬件接口的驱动程序。这个想法是要有一个执行实际硬件访问的模块(i2c_driver.c / .h)和一个描述设备的模块(i2c_devices.c / .h),该模块利用了i2c_driver。

该驱动程序旨在与单个函数调用一起使用,该函数将描述事务的结构传递给该函数。因此,例如,访问设备看起来像这样:

I2C_Transaction_TypeDef trans;

trans.Instance      = I2C1;
trans.Operation     = I2C_OPERATION_WRITE;
trans.DeviceAddress = HDC1080_I2C_ADDR;
trans.RegAddress    = HDC1080_TEMP_ADDR;
trans.Count         = 2;
trans.pData         = (uint8_t *)txbuf;

I2C_do_transaction(&trans);

模块的用法如下:

main.c -> i2c_devices.h -> i2c_drivers.h -> (low level MCU stuff)
          i2c_devices.c    i2c_drivers.c

问题

上面显示的事务的 I2C_Transaction_TypeDef 描述包含成员“ Operation”,可以是固定选项集的任何选项。这些选项存储在i2c_driver.h中为

typedef enum {
    I2C_OPERATION_WRITE,
    I2C_OPERATION_READ,
    I2C_OPERATION_READ_ADDRESS
} I2C_Operations;

,因此 I2C_Transaction_TypeDef 成员 Operation 的类型为 I2C_Operations ,以明确声明应使用这些选项/成员之一。

这对于在i2c_driver.c(包括i2c_driver.h)中的使用非常有用,例如:

trans->Operation = I2C_OPERATION_WRITE;

与第一个代码段完全相同的行是什么。但是,在第一个代码段中,我最终遇到了一个错误。 标识符“ I2C_OPERATION_WRITE”未定义

如果我将i2c_devices.c更改为直接包含i2c_driver.h,而不是通过i2c_driver.h间接包含它,则会起作用。

不工作:

i2c_devices.c -> i2c_devices.h -> i2c_drivers.h

工作:

i2c_devices.c -> i2c_devices.h
              -> i2c_drivers.h

请帮助我理解原因。

1 个答案:

答案 0 :(得分:0)

正如你们中一些人在问题下方的评论中指出的(好家伙!),我遇到了复制/粘贴错误:当我将前一个模块拆分为设备和驱动程序时,我没有调整头文件,因此它们是相同的。