我正在处理涉及以下代码的问题,我有点迷茫。 “ class []”在做什么,这如何改变我打印成员的方式?我以前从未见过像这样的初始化。
Dim firName, secName As String
firName = "Da*"
secName = "Daniel"
search = InStr(1, secName, firName, vbTextCompare)
MsgBox (search)
答案 0 :(得分:1)
代码的作用:
struct Student
有点特殊,因为它包含一个指向相同类型struct Student *teammate
的对象的指针。这可以通过使用指向带有“结构标签” Student
的对象的指针来实现,该对象充当向前声明的一种形式。
typedef struct Student SType;
只是隐藏了struct
关键字,这是编码风格的问题。这样写整个事情会更干净:
typedef struct Student {
char Initials2[2];
int id;
struct Student *teammate;
} SType;
SType class[6] = { {{'X','Y'},123, RSpt}, ....
只是6个结构的数组,每个结构均已初始化。一堆宏扩展到名为“ class”的同一数组的变量地址。这是糟糕的样式-程序员将其用作“命名”数组中每个项目的肮脏方式。后缀“ pt”似乎表示指针。
代码的编写方式:
通过使用union
,可以将数组的每个项目与标识符相关联,而不是使用难看的宏。例如:
typedef union
{
struct foo
{
int foo;
int bar;
} foo;
int array [2];
} foobar;
在这里,对象foobar fb;
可以用fb.foo.foo
或fb.array[0]
的形式访问,它表示数组的相同项0。使用现代标准C,我们可以删除内部结构名称(匿名结构),然后仅以fb.foo
的形式访问对象。
此外,它可以与指定的初始化程序结合使用,以通过其名称foobar fb { .foo = 1, .bar = 2 };
初始化结构的某些命名成员。
通过使用联合,匿名结构和指定的初始化程序来重写您的示例,我们改为:
typedef struct student {
char initials [2];
int id;
struct student *teammate;
} s_type;
typedef union
{
struct
{
s_type XY;
s_type AB;
s_type RS;
s_type CD;
s_type JV;
s_type RY;
};
s_type array [6];
} class_t;
class_t class =
{
.XY = { .initials={'X','Y'}, .id=123, .teammate = &class.RS},
.AB = { .initials={'A','B'}, .id= 23, .teammate = &class.RY},
.RS = { .initials={'R','S'}, .id= 11, .teammate = &class.XY},
.CD = { .initials={'C','D'}, .id= 44, .teammate = &class.JV},
.JV = { .initials={'J','V'}, .id= 42, .teammate = &class.CD},
.RY = { .initials={'R','Y'}, .id=457, .teammate = &class.AB},
};
这更容易阅读和理解。另外,如果需要,我们仍然可以将其用作class.array[i]
的数组。