zku*_*rtz 4 c pointers typedef
考虑以下C代码:
typedef char * MYCHAR;
MYCHAR x;
Run Code Online (Sandbox Code Playgroud)
我的理解是结果是x是"char"类型的指针.但是,如果x的声明远离typedef命令发生,则代码的人类读者不会立即知道x是指针.或者,可以使用
typedef char MYCHAR;
MYCHAR *x;
Run Code Online (Sandbox Code Playgroud)
哪个被认为是更好的形式?这不仅仅是风格问题吗?
如果指针永远不会被解除引用或以其他方式直接操作 - IOW,您只将它作为参数传递给API - 那么可以将指针隐藏在typedef后面.
否则,最好使类型的"指针"显式化.
我只会在结果类型的指针性质不重要的情况下使用指针 typedef。例如,当想要声明一个不透明的“句柄”类型时,指针 typedef 是合理的,该类型恰好被实现为指针,但不应该被用户用作指针。
typedef struct HashTableImpl *HashTable;
/* 'struct HashTableImpl' is (or is supposed to be) an opaque type */
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,HashTable是哈希表的“句柄”。用户最初将从函数等处接收该句柄CreateHashTable,并将其传递给HashInsert函数等。用户不应该关心(甚至不知道)这HashTable是一个指针。
但是,当用户应该理解该类型实际上是一个指针并且可以用作指针时,指针 typedef 会严重混淆代码。我会避开他们。显式声明指针可以使代码更具可读性。
有趣的是,C 标准库避免了此类指针类型定义。例如,FILE显然旨在用作不透明类型,这意味着库可以将其定义为而不是让我们一直typedef FILE <some pointer type>使用。FILE *但出于某种原因,他们决定不这样做。