在C中使用STRUCT时的命名约定

Dea*_*ean 20 c

我正在学习C并找到某人定义了一个结构体,它的结构名称在它前面有_.这是我第一次看到它,有人可以告诉我一点吗?为什么有人会使用_aStructName而不是aStructName,有什么好处?

struct _huffmanNode {
    int value;
    uint32_t frequency;

    int hasChild;
    struct _huffmanNode *child[2];

    struct _huffmanNode *next;
};
Run Code Online (Sandbox Code Playgroud)

同样地,我发现有人在以下代码中使用这种命名约定:

typedef struct HuffCode_ {

unsigned char      used;
unsigned short     code;
unsigned char      size;

} HuffCode;
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 12

用户代码没有任何好处,它只是丑陋.在第二个例子中,HuffCode_甚至不需要,因为struct类型已经被命名typedef.

唯一有用的地方是:

  1. 什么时候StructName使用,StructName_给出一个不同的名称(但你应该提出一个更好的名字).
  2. C标准库中未由标准定义的标识符不应与用户代码标识符冲突.因此,C库编写者使用_前缀,希望用户不会使用它.不幸的是,有些用户这样做
  3. 在非常旧的编译器中,给出与struct其中使用的名称不同的名称可能是有用的typedef.typedef如果要构建链接结构,则需要使用其他名称(示例).


Jer*_*est 6

我认为这样做主要是因为非常错误的想法,即结构和类型不能使用相同的名称。换句话说,以某种方式

struct MyStruct;
typedef struct MyStruct MyStruct;
Run Code Online (Sandbox Code Playgroud)

会以奇怪的方式发生冲突,因为struct和和typedef具有相同的名称。这在C语言中是错误的。结构体的名称被视为tag,而typedef创建类型名称。它们位于两个不同的命名空间中,不会发生冲突。我认为,假设您完全使用typedef,则将结构的标记与typedef相同的意义就更大了。在C语言中,必须始终使用struct关键字引用结构。例如,如果您定义

struct MyStruct;

但不要输入typedef,则以下内容无效:

void myfunction()
{
  MyStruct var;   /* compiler error: MyStruct is not defined. */
  struct MyStruct var2; /* this is OK, MyStruct is a valid name for a struct. */
}
Run Code Online (Sandbox Code Playgroud)

如果要MyStruct在C中定义类型的变量(或参数),则必须提供typedef:

typedef struct MyStruct MyStruct;

void myfunction2()
{
  MyStruct var;  /* this is ok now */
  struct MyStruct var2; /* this is still ok too */
}
Run Code Online (Sandbox Code Playgroud)

在第二个示例中var,,和var2具有相同的类型,尽管这并不明显。实际上,如果更改了typedef,则它们将不再具有相同的类型。当心这一点!如果类型定义更改,可能会导致一些有趣的错误。

在C ++中,结构定义本质上会创建一个隐式,typedef以便上面的两个代码片段都可以编译。在C ++中,结构名(或标记)和类型名在本质上没有区别。我认为,这是用相同的方式命名两者的另一个重要原因,特别是如果您预计某个时候某些C ++代码可能会使用C模块。


Chr*_*rle 5

很多时候在C语言中,人们喜欢键入自己的结构,这样他们看起来就不那么难看了.因此,他们将结构本身命名为丑陋的东西,并将typedef称为干净的东西.通常我在GNU世界中看到的惯例是:

typedef struct mytype_t
{
    int field;
    char field2;
} mytype;
Run Code Online (Sandbox Code Playgroud)

  • 它们应该省略名称,或者给它命名为`typedef`.`_t`约定不是uglifying,它表示某事物是一种类型.(我经常看到`typedef struct foo {...} foo_t`.) (9认同)
  • 还值得一提的是,Linux 内核编码风格告诉我们,typedef 结构和指针只是为了隐藏其本质而犯了一个“错误”,避免这种 typedef 会更干净。(来源此处,第 5 段:http://lxr.linux.no/linux+v4.15.14/Documentation/process/coding-style.rst) (3认同)
  • 也许值得一提的是,POSIX 声称拥有后缀为“*_t”的类型。 (2认同)