创建只有一个字段的结构的目的是什么
What is the purpose of creating a struct with only one field
在我公司的项目中,我多次看到人们创建了一个仅包含一个元素的结构。
添加了最新的一个,在此示例中,ipAddr 是另一个结构(对 ipAddr 是数组的情况的一个很好的解释由 'Frerich Raabe' 给出,但不幸的是,这里不是这种情况)
typedef struct
{
ipAddr ip;
} Record;
我想如果代码正在更改并且在开始时这是有道理的,因为可以轻松添加更多字段并且可以轻松操作代码以支持新字段,但这是一个很久以前就开始编写的项目根据设计,所以我认为这不是问题所在。
那为什么要创建一个字段的结构?
我能想到几个原因:
- 以防以后需要更多字段。这有点常见。
- 故意使外部类型与内部类型不兼容。
第二个例子,想象一下:
typedef struct
{
char postal_code[12];
} Destination;
在这种情况下,目的地完全由邮政编码指定,但这将让我们定义如下函数:
int deliver(const char* message, const Destination* to);
这样一来,用户就不会无意中调用两个参数相反的函数,如果它们都是纯字符串,他们可以很容易地做到这一点。
只有一个字段的结构的一个常见原因是单个字段是一个数组,并且您希望能够定义返回此类数组值的函数。考虑例如
typedef unsigned char ipAddr[4];
void f(ipAddr ip); /* OK */
ipAddr g(void); /* Compiler barfs: cannot return array. */
这可以通过引入具有单个 ipAddr
类型成员的 struct
来解决:
typedef unsigned char ipAddr[4];
typedef struct {
ipAddr ip;
} Record;
void f(Record ip); /* OK */
Record g(void); /* Also OK: structs can be returned by value. */
但是,即使将数组传递给函数也是有问题的:您实际上并没有传递数组,而是传递了一个指针(类型 "decays" 变成了一个指针)。假设上面声明的 f
需要创建给定 IP 地址的副本:
typedef unsignd char ipAddr[4];
void f(ipAddr ip) {
ipAddr *a = malloc(sizeof(ip));
/* ... */
}
这只适用于 32 位构建,因为指针的大小与四个 unsigned char
值的数组的大小相同(4 个字节)。 64 位构建(或不同大小的数组)会出现错误,分配过多或过少的内存。发生这种情况是因为 f
、ip
是 unsigned char *
、i.e.a 指针类型。 struct
有助于解决这个问题,因为它不会腐烂。
在我公司的项目中,我多次看到人们创建了一个仅包含一个元素的结构。 添加了最新的一个,在此示例中,ipAddr 是另一个结构(对 ipAddr 是数组的情况的一个很好的解释由 'Frerich Raabe' 给出,但不幸的是,这里不是这种情况)
typedef struct
{
ipAddr ip;
} Record;
我想如果代码正在更改并且在开始时这是有道理的,因为可以轻松添加更多字段并且可以轻松操作代码以支持新字段,但这是一个很久以前就开始编写的项目根据设计,所以我认为这不是问题所在。
那为什么要创建一个字段的结构?
我能想到几个原因:
- 以防以后需要更多字段。这有点常见。
- 故意使外部类型与内部类型不兼容。
第二个例子,想象一下:
typedef struct
{
char postal_code[12];
} Destination;
在这种情况下,目的地完全由邮政编码指定,但这将让我们定义如下函数:
int deliver(const char* message, const Destination* to);
这样一来,用户就不会无意中调用两个参数相反的函数,如果它们都是纯字符串,他们可以很容易地做到这一点。
只有一个字段的结构的一个常见原因是单个字段是一个数组,并且您希望能够定义返回此类数组值的函数。考虑例如
typedef unsigned char ipAddr[4];
void f(ipAddr ip); /* OK */
ipAddr g(void); /* Compiler barfs: cannot return array. */
这可以通过引入具有单个 ipAddr
类型成员的 struct
来解决:
typedef unsigned char ipAddr[4];
typedef struct {
ipAddr ip;
} Record;
void f(Record ip); /* OK */
Record g(void); /* Also OK: structs can be returned by value. */
但是,即使将数组传递给函数也是有问题的:您实际上并没有传递数组,而是传递了一个指针(类型 "decays" 变成了一个指针)。假设上面声明的 f
需要创建给定 IP 地址的副本:
typedef unsignd char ipAddr[4];
void f(ipAddr ip) {
ipAddr *a = malloc(sizeof(ip));
/* ... */
}
这只适用于 32 位构建,因为指针的大小与四个 unsigned char
值的数组的大小相同(4 个字节)。 64 位构建(或不同大小的数组)会出现错误,分配过多或过少的内存。发生这种情况是因为 f
、ip
是 unsigned char *
、i.e.a 指针类型。 struct
有助于解决这个问题,因为它不会腐烂。