union、.c 和 .h 文件中的 Typedef 嵌套结构

Typedef nested structure in union, .c and .h file

我应该如何在头文件中声明这个联合?

#include <avr/io.h>
#include <stdint.h>
#include <stdio.h>
#include "i2c_twi.h"

#define DS3231_ADDR 0xd0

typedef union {
    uint8_t bytes[7];
    struct{
         uint8_t ss;
         uint8_t mm;
         uint8_t hh;
         uint8_t dayOfWeek;
         uint8_t day;
         uint8_t month;
         uint8_t year;
     };
 } TDATETIME;

 TDATETIME dateTime;

我这样声明的,我不能在我的主函数中使用dataTime

#include <stdint.h>
#ifndef DS3231_H_
#define DS3231_H_

typedef union _TDATETIME TDATETIME

#endif /* DS3231_H_ */

编译器生成以下错误:

../main.c:42:26: error: ‘dateTime’ undeclared (first use in this function)
DS3231_get_dateTime( &dateTime );

In C, you must use the union keyword to declare a union variable. In C++, the union keyword is unnecessary:

union TDATETIME dateTime;

发件人:https://msdn.microsoft.com/en-us/library/5dxy4b7b(v=vs.80).aspx

你想做什么?

  1. typedef union _TDATETIME TDATETIME; typedef union TDATETIME _TDATETIME;

  2. 如果头文件中的结构如下,那么"TDATETIME dateTime"应该在.c文件中。

    typedef 联合 {

    ... } 日期时间;

供您参考

如果你所有的头文件都是这样的:

typedef union _TDATETIME TDATETIME;

那只是设置了typedef,并没有定义union。您需要同时定义 union 和它附带的 typedef。另外,如果你想在多个文件中使用这种类型的变量,请在头文件中为该变量放置一个 extern 声明,然后在一个 C 文件中定义它:

在ds3231.h中:

#include <stdint.h>
#ifndef DS3231_H_
#define DS3231_H_

typedef union {
    uint8_t bytes[7];

    struct{
         uint8_t ss;
         uint8_t mm;
         uint8_t hh;
         uint8_t dayOfWeek;
         uint8_t day;
         uint8_t month;
         uint8_t year;
     };
 } TDATETIME;

 extern TDATETIME dateTime;

#endif /* DS3231_H_ */

在ds3221.c中:

#include "ds3221.h"

TDATETIME dateTime;

在main.c中:

#include <stdio.h>
#include "ds3221.h"

int main()
{
    ...
    // use dateTime
    ...
}