C语言 结构类型定义的最佳实践?[关闭]

wnavrhmk  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(99)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

11天前关闭
Improve this question
关于typedef、标记和结构命名空间以及由系统库或编译器保留的前导_,我已经问了很多问题。我的问题是:
结构类型定义的最佳实践是什么?
例如,以下是一些可能性:

typedef struct ll_item {...} ll_item;
typedef struct _ll_item {...} ll_item;
typedef struct ll_item {...} ll_item_type;
typedef struct ll_item {...} LLItemType;

谁有经验,在其中是典型的使用,最标准的?我曾看到教科书对结构名称本身使用前导下划线方法(我也会直观地使用该方法),但是如果系统struct使用该名称,这会污染名称空间吗?

xzv2uavs

xzv2uavs1#

这都是相当主观的。带有前导下划线的标识符绝对是不好的做法,因为可能与标准库/编译器内部冲突,请参阅C 7.1.3:
所有以下划线开始的标识符始终保留用作普通和标记名称空间中文件范围的标识符。
最常见的做法实际上是根本不使用结构体标记。只有少数特殊情况下才需要它们,例如自引用结构和不透明类型等。基于这一点,我主观地说,这两个都是“最好的”:

typedef struct {...} ll_item;
typedef struct ll_item {...} ll_item;

因为struct ll_item(struct标记版本)和ll_item(typedef版本)都引用了 * 相同 * 的对象类型,即使它们碰巧存在于不同的命名空间中。struct ll_itemll_item是兼容类型。
一个自引用的结构体看起来像这样:

typedef struct ll_item 
{
  ...
  struct ll_item* next;
} ll_item;

一个不透明的类型前向声明看起来像这样:

typedef struct ll_item ll_item;

一个不透明的类型定义(private)将不会使用typedef,而是引用相同的类型:

struct ll_item { ... };

至于命名,那只是根据您的编码标准。ll_item_type也可以,如果您不关心POSIX,甚至可以使用ll_item_t

相关问题