创建一个只有一个字段的结构体的目的是什么

Ant*_*n.P 3 c struct

在我公司的项目中,我看到好几次人们创建了一个只包含一个元素的结构体。添加了最新的一个,在这个例子中 ipAddr 是另一个结构('Frerich Raabe' 给出了对 ipAddr 是一个数组的情况的一个很好的解释,但不幸的是这里不是这种情况)

typedef struct
{
  ipAddr ip;
} Record;
Run Code Online (Sandbox Code Playgroud)

我想如果代码正在更改并且在开始时这是有道理的,因为可以轻松添加更多字段并且可以轻松操作代码以支持新字段,但这是一个很久以前开始的项目,根据设计编写,因此我不认为这是这里的问题。

为什么要创建一个字段的结构呢?

Joh*_*nck 6

我能想到几个原因:

  1. 以防以后可能需要更多字段。这有点常见。
  2. 故意使外部类型与内部类型不兼容。

对于第二个例子,想象一下:

typedef struct
{
    char postal_code[12];
} Destination;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,目的地完全由邮政编码指定,但这将让我们定义如下函数:

int deliver(const char* message, const Destination* to);
Run Code Online (Sandbox Code Playgroud)

这样,用户就不会在不经意间调用两个参数颠倒的函数,如果它们都是纯字符串,他们很容易做到这一点。


Fre*_*abe 6

仅包含一个字段的结构的一个常见原因是该单个字段是一个数组,并且您希望能够定义返回此类数组值的函数。考虑例如

typedef unsigned char ipAddr[4];

void f(ipAddr ip);         /* OK */
ipAddr g(void);            /* Compiler barfs: cannot return array. */
Run Code Online (Sandbox Code Playgroud)

struct这可以通过引入带有单个类型成员的a 来解决ipAddr

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. */
Run Code Online (Sandbox Code Playgroud)

然而,即使将数组传递给函数也是有问题的:您实际上并没有传递数组,而是传递了一个指针(类型“衰减”为指针)。假设上面声明f需要创建给定 IP 地址的副本:

typedef unsignd char ipAddr[4];

void f(ipAddr ip) {
    ipAddr *a = malloc(sizeof(ip));
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这仅适用于 32 位版本,因为指针的大小与四个值的数组的大小相同(4 字节)unsigned char。64 位构建(或不同大小的数组)会出现错误,分配的内存过多或过少。发生这种情况是因为内部f,ip的类型为unsigned char *, 即指针。Astruct对此有帮助,因为它不会腐烂。