这是一个例子。根据您的喜好或需求,可以进行多种变化:
struct MyStruct
{
enum MyNum { Integer, Float, String } WhatTypeIsHere;
size_t HowMany;
union
{
int Integer;
float Float;
const char *String;
} u[MaximumNumberOfElement];
};
要设置,给定一些x
是struct MyStruct
:
x.WhatTypeIsHere = Float;
x.HowMany = NumberOfObjectsThisTime;
for (i = 0; i < NumberOfObjectsThisTime; ++i)
x.u[i].Float = some value;
Integer
其他类型的设置类似。
读书:
switch (x.WhatTypeIsHere)
{
case Float;
for (i = 0; i < x.HowMany; ++i)
Use x.u[i].Float for something…;
break;
case Integer:
…
}
可以声明您的函数,以便调用者将 a 传递struct MyStruct
给它,然后该函数将其填充,或者该函数定义一个局部struct MyStruct
变量并按值返回它。(通常情况下,当你做后者时,在 C 的底层实现中发生的是:调用者为 a 分配空间struct MyStruct
并将其地址传递给负责填充它的被调用函数。如果编译器优化得当,性能等效于第一个选项,即使源代码看起来像被调用的函数正在按值返回结构。)
关于结构和工会的组织方式有多种选择。您可以使用数组联合而不是联合数组,并且可以传递有关单独返回的类型的信息,而不是在enum
结构内部传递,并且已知元素的数量可以单独返回或通过其他一些信息返回,比如数组里面的一个标记值。对于小型、简单的用途,这些变化可能没有太大区别,它们由您来选择。