在结构和结构中定义结构何时使用联盟?

时间:2013-12-15 03:42:19

标签: c nested structure

我宣布包含有关某人信息的结构:

  


  日期/时间添加到列表中   血型
  需要器官类型

稍后将信息与从文件中读取的一些信息进行比较,但我现在有一个更普遍的问题。

考虑这种实施:

typedef struct {
    short month;
    short day; 
} dateT;

typedef struct {
    short hour;
    short minute;
} timeT;

typedef struct {
    char name[SIZE];
    char organName[SIZE];
    char bloodType[BT_LEN]; 
    dateT dateAdded;
    timeT timeAdded;
} personT;

如果将所有这些信息放在单个结构中(没有子结构)不是一个选项,那么将这三个相关结构放在一个联合或嵌套dateTtimeT中是否更有效率?在personT内?

2 个答案:

答案 0 :(得分:1)

如果您只想要union定义中的许多可能变量类型之一,那么union将是一个不错的选择。例如,如果您只想要时间日期,则可以执行以下操作:

typedef struct 
{
    short month;
    short day; 
} dateT;

typedef struct 
{
    short hour;
    short minute;
} timeT;

typedef union 
{ 
    dateT dateAdded;
    timeT timeAdded;
} myUnion;

myUnion.timeAdded.hour = 5; // timeAdded "exists"; dateAdded does not "exist"
myUnion.dateAdded.day = 7;  // timeAdded doesn't "exist" anymore; dateAdded "exists" now

关于如何定义结构和子结构的问题,答案非常适合您。您可以定义一个struct来保存您可能需要的所有数据,但它可能很长且难以阅读。如果有意义的话,您可以将逻辑变量分开到另一个struct

您可以在dateT中定义timeTpersonT,但唯一的好处是阻止他人声明该类型的struct。他们需要声明struct类型的personT才能将这些类型作为子类型。

答案 1 :(得分:1)

我不太确定你想在这里使用union,因为你需要时间和日期信息。

通常,我会使用标准类型time_t来表示时间点,然后通过标准库函数将其转换为人类可解析的时间单位(struct tm),如localtime() / {{ 3}}。这样可以省去处理时区,夏令时变化等问题的麻烦。