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

时间:2011-04-05 21:51:01

标签: c

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

struct _huffmanNode {
    int value;
    uint32_t frequency;

    int hasChild;
    struct _huffmanNode *child[2];

    struct _huffmanNode *next;
};

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

typedef struct HuffCode_ {

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

} HuffCode;

4 个答案:

答案 0 :(得分:12)

用户代码没有任何好处,只是丑陋。在第二个示例中,HuffCode_甚至不是必需的,因为struct类型已经由typedef命名。

唯一有用的地方是:

  1. StructName已被使用时,StructName_会提供不同的名称(但您应该提供更好的名称)。
  2. C标准库中未由标准定义的标识符不应与用户代码标识符冲突。因此,C库编写者使用_前缀,希望用户不会使用它。不幸的是,有些用户会这样做。
  3. 在非常旧的编译器中,为struct提供与typedef中使用的名称不同的名称可能很有用。如果您正在构建链接结构(example),则需要typedef和其他名称。

答案 1 :(得分:5)

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

typedef struct mytype_t
{
    int field;
    char field2;
} mytype;

答案 2 :(得分:5)

我认为这主要是因为结构和类型不能具有相同名称的错误观念。换句话说,那不知何故

struct MyStruct;
typedef struct MyStruct MyStruct;

会以奇怪的方式发生碰撞,因为structtypedef具有相同的名称。这在C中是错误的。结构的名称被认为是标记,而typedef创建了类型名称。它们存在于两个不同的命名空间中,不会发生冲突。在我看来,假设你根本使用了typedef,那么struct的标签与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. */
}

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

typedef struct MyStruct MyStruct;

void myfunction2()
{
  MyStruct var;  /* this is ok now */
  struct MyStruct var2; /* this is still ok too */
}

在第二个示例中,varvar2具有相同的类型,但这并不明显。实际上,如果typedef被更改,它们将不再具有相同的类型。小心这个!如果类型定义发生变化,它可能会导致一些有趣的错误。

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

答案 3 :(得分:1)

我使用第二个例子的变体:

typedef struct huffcode {
... } HuffCode;