C 中的结构声明了一个数据结构,它将不同的数据类型关联到一块连续的内存中。
Typedef 是一种创建用户定义的数据类型名称的方法。这对许多应用程序都很有用,包括<stdint.h>
结构似乎专门与 typedef 一起使用。似乎定义 a 的默认行为struct也应该定义 a typedef。
为什么我要在struct不使用 a 的情况下进行定义typedef?
这是个人偏好的问题,可能会强加给从事同一项目的其他人作为惯例。例如,Linux 内核编码风格指南明确不鼓励引入新的 typedef。
虽然我不一定同意该指南中的所有内容,但在我的 TXR 语言项目中,其中一些似乎很愚蠢(vps_t a;例如virtual_container_t a;:问题取决于选择的神秘名称,而typedef不仅仅是 typedef 的存在) ,这里有一些原始统计数据:
txr$ git grep '^typedef struct' '*/*.[ch]' '*.[ch]' | wc
25 91 839
txr$ git grep '^struct' '*/*.[ch]' '*.[ch]' | wc
135 528 4710
Run Code Online (Sandbox Code Playgroud)
与代码开头的行struct 想个办法typedef struct 线由5.4的一个因素!
C 的 union/tag 命名空间特性意味着您可以foo在与 a 相同的范围内调用一个变量struct foo而不会发生冲突,这很有用。这个额外的命名空间让我们有机会不使用用户定义的类型名称污染常规标识符命名空间,从而提高卫生。
代价是我们必须键入struct foo而不是仅仅foo在声明中。
如果您有使用类/类型名称不会侵入词法变量命名空间的语言(如 Common Lisp)的经验,这将特别有意义。
但是,上面的代码库编译为 C++,所以这会给它带来一些麻烦。在C++中,struct foo定义foo为一个类型,可以在普通命名空间中引用。
另一个原因是有一些清晰度。当我们看到这样的声明时:
struct foo x;
Run Code Online (Sandbox Code Playgroud)
我们知道 x 是一个结构,而
foo x;
Run Code Online (Sandbox Code Playgroud)
可以是任何东西;它可能是typedef double foo。有时我们会追求那种抽象。当您想隐藏某些内容的实施方式时,请访问typedef. 但是,typedef不提供完美的抽象。
另外,如果我们看到:
struct foo f;
struct bar b;
Run Code Online (Sandbox Code Playgroud)
我们知道这些必然是不同的、不兼容的类型。我们不知道给出:
foo f;
bar b;
Run Code Online (Sandbox Code Playgroud)
它们都可以是typedefs 表示相同的结构,也可以int表示我们所知道的所有内容。
如果您使用typedef指针类型,但代码取消了它们的引用,它看起来很傻:
foo x = get_foo();
char *fname = x->name; /* what? */
Run Code Online (Sandbox Code Playgroud)
该内核编码风格文档对上述内容有这样的说法:通常,具有可以合理直接访问的元素的指针或结构不应该是 typedef。
不使用typedeffor 结构与使用标签命名空间的一些卫生有关,因为它与避免typedef这样的事情有关:保持代码明确,并typedef为我们实际上需要适当抽象的情况保留。
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |