2

我想知道如何在它所在的文件之外使用 typedef 结构。我的意思是,我有这个:

在一个名为“rtc_i2c.c”的文件中,我有------------------------------------

#include "rtc_i2c.h"

struct time_date_str
{
  char year;
  char month;
  char date;
  char day;

  char hour;
  char minute;
  char second;
};


int RTCGetTime(TimeDate *timdatstrptr)
{
  timdatstrptr -> second = 0x12;

  return 0;
}

然后在一个名为“rtc_i2c.h”的文件中我有-----------------------------

#ifndef RTC_I2C_H 
#define RTC_I2C_H 

typedef struct time_date_str TimeDate;

#endif

在“main.c”中,我有 ----------------------------- --------

#include "rtc_i2c.h"

TimeBase *TimeDateData;

void main(void)
{
  char DateTimeASCII[20]; 

  RTCGetTime(TimeDateData);

  DateTimeASCII[0] = ????????
}

然后,当我进入我的代码时,我进入 RTCGetTime 并在监视窗口中看到“timdatstrptr -> second = 12”分配正确执行。但问题在外面。如果我将“TimeDateData --> second”放在带有 ???????? 的空格中,编译器会生成错误。所以我不知道我应该如何通过指针访问全局定义数组的内容。

如果我理解,声明为“TimeBase *TimeDateData”的指针指向我的数组,并使用“-->”访问,因为它是一个指针。我错了吗?这是如何运作的?

任何人都可以帮助我吗?谢谢!!

4

2 回答 2

3

编译器不知道time_date_str. 您有 2 个选择:

  • struct time_date_str声明移动到头文件中
  • rtc_i2c.c

这一切都归结为一个问题:外部实体是否应该知道这个结构的细节?

还有其他问题,包括您将未初始化的指针传递给RTCGetTime.

于 2012-07-05T12:56:25.567 回答
0

您不应该在它所在的文件之外使用该结构,这就是为什么它位于 filertc_i2c.c中,而不是位于rtc_i2c.h. 尝试寻找其他方法来完成您的需要。

例如,我猜一个声明RTCGetTime也出现在某个地方rtc_i2c.h,这就是为什么你可以在另一个文件(main.c)中使用它。所以,在 中寻找其他有用的功能rtc_i2c.h,也许有什么可以用的?

如果你绝对不能这样做,只需将结构的定义移动到头文件中:

#ifndef RTC_I2C_H 
#define RTC_I2C_H 

struct time_date_str
{
  char year;
  char month;
  char date;
  char day;

  char hour;
  char minute;
  char second;
};

typedef struct time_date_str TimeDate;

#endif
于 2012-07-05T13:08:50.740 回答