我正在学习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)
我认为这样做主要是因为非常错误的想法,即结构和类型不能使用相同的名称。换句话说,以某种方式
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模块。
很多时候在C语言中,人们喜欢键入自己的结构,这样他们看起来就不那么难看了.因此,他们将结构本身命名为丑陋的东西,并将typedef称为干净的东西.通常我在GNU世界中看到的惯例是:
typedef struct mytype_t
{
int field;
char field2;
} mytype;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28876 次 |
最近记录: |