我正在学习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;
答案 0 :(得分:12)
用户代码没有任何好处,只是丑陋。在第二个示例中,HuffCode_
甚至不是必需的,因为struct
类型已经由typedef
命名。
唯一有用的地方是:
StructName
已被使用时,StructName_
会提供不同的名称(但您应该提供更好的名称)。_
前缀,希望用户不会使用它。不幸的是,有些用户会这样做。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;
会以奇怪的方式发生碰撞,因为struct
和typedef
具有相同的名称。这在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 */
}
在第二个示例中,var
和var2
具有相同的类型,但这并不明显。实际上,如果typedef被更改,它们将不再具有相同的类型。小心这个!如果类型定义发生变化,它可能会导致一些有趣的错误。
在C ++中,结构定义实质上创建了一个隐式typedef
,以便上述两个代码片段都可以编译。在C ++中,结构名称(或标记)和类型名称之间基本上没有区别。在我看来,这是以同样方式命名这两者的另一个重要原因,特别是如果您预计某些C ++代码可能会在某些时候使用您的C模块。
答案 3 :(得分:1)
我使用第二个例子的变体:
typedef struct huffcode {
... } HuffCode;