C 在结构中定义结构&;什么时候使用工会?

C 在结构中定义结构&;什么时候使用工会?,c,nested,structure,C,Nested,Structure,我声明包含个人信息的结构: 名称 添加到列表中的日期/时间 血型 需要的器官类型 稍后会将这些信息与从文件中读取的一些信息进行比较,但我现在有一个更一般的问题 考虑到这一执行情况: typedef struct { short month; short day; } dateT; typedef struct { short hour; short minute; } timeT; typedef struct { char name[SIZE];

我声明包含个人信息的结构:

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

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

考虑到这一执行情况:

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;

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

A
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


您可以在
personT
中定义
dateT
timeT
,但这样做的唯一好处是防止其他人声明该类型的
struct
。他们需要声明
personT
类型的
struct
,以便将这些类型作为子类型。

我不太确定您在这里使用union的目的是什么,因为您需要时间和日期信息


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

联盟中的事物占用相同的内存空间,而且一次只能使用其中一种事物。可能不是您想要的。如果您只想在联合定义中使用多种可能的变量类型中的一种,您所说的
…是什么意思。
?在代码中的联合定义中,您已经包含了时间和日期。如果您声明myUnion的一个实例,您将有效地创建时间和日期,对吗?不,
union
s不是这样工作的。在我给出的示例中,只能使用
dateAdded
timeAdded
,而不能同时使用这两种。如果两者都需要,请使用
struct
@sherrellbc我在
联合
答案中添加了更多内容。希望这会有所帮助。我对此做了更多的研究,结果显示,联合中包含的任何内容都存在于内存中的同一位置,并且所需的内存空间占用了两个数据中较大的一个。在那个位置实际存在的是最近设置的内存。在提出这个问题之前,我的印象是,工会是一种创造工会的类型,从某种意义上说,它是一个巨大的结构或其他东西。我现在看到了不同之处,谢谢你。@sherrellbc Bravo对它进行了研究,而不仅仅是相信我的话。