typedef 的命名方案

Posted

技术标签:

【中文标题】typedef 的命名方案【英文标题】:Naming scheme for typedefs 【发布时间】:2010-11-14 05:42:55 【问题描述】:

我正在开发一个广泛使用结构的库,例如

typedef struct foo_bar_s 
    ...
 foo_bar_t;

使用 _t 后缀是个坏主意,因为它是 POSIX 保留的命名空间。结构的 _s 后缀也没什么用。所以我想我可以把它全部改成

typedef struct foo_bar 
    ...
 foo_bar;

或者如果不需要结构名称

typedef struct 
    ...
 foo_bar;

但是,我无法再将 typedef 与常规符号(变量等)区分开来。这真的很重要吗?我应该为 typedef 使用不同的合适命名方案吗?还是没那么重要?

我真的不太确定。你怎么看?另外,您对 typedef 命名方案有什么建议?

【问题讨论】:

【参考方案1】:

我使用 Dave Hanson 的 C Interfaces and Implementations 中使用的命名约定:类型以模块名称和大写 T 命名。例如,序列的类型是 Seq_T,哈希表的类型是 @ 987654324@。在模块的实现中,Hanson 使用#define 缩写为T。这基本上是适用于 C 编程的Modula-3 约定,但我发现经过短暂的初步冲击后它运行良好。

【讨论】:

【参考方案2】:

虽然“_t”是保留的,但您遇到问题的可能性很小。然而,这个约定是旧版本 C 的残余,在旧版本中需要这种语法才能命名结构,所以现在你可以简单地编写如下内容(省略 typedef 和 typedef 名称):

结构名称_of_struct 类型 1 成员 1; 类型 2 成员 2; // ... N型成员N; ;

是的,您可以在当前的 C 标准中使用单行 cmets ("//...")。

【讨论】:

_t 确实是 POSIX 保留的 现在是两个人说的。我仔细检查了,结果证明你是对的。我要解决这个问题。 _t 不是 POSIX 保留的,因为不允许其他任何人使用此类名称。相反,POSIX 实现只能使用这种形式的类型名称。 其实请看:gnu.org/s/libc/manual/html_node/Reserved-Names.html 根据文档:“以'_t'结尾的名称是为附加类型名称保留的。”当然,如果一个人总是在一个函数和类型名称前加上他们的库的名称(例如“mylibrary_suchandsuchtype_t”),他们不太可能与 C 标准库的未来版本发生冲突。

以上是关于typedef 的命名方案的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C 程序员使用 typedef 来重命名基本类型?

typedef struct LNode命名结构指针(线性表的链式存储)

C++ 类 Typedef Struct 没有命名类型

15)类型重命名typedef

模板 typedef 不是类或命名空间名称

C/c++:语言中关键字typedef(类型重命名)enum(整型常量值集合,代替#define)的使用