[英]Typedef struct wrong declaration?
我参考了下面的教程,后来意识到使用typedef声明结构是错误的方法。
typedef struct
{
char name[namesize];
char address[addresssize];
int YearOfBirth;
int MonthOfBirth;
int DayOfBirth;
} PersonalData;
然后声明:
PersonalData x;
但是,我相信正确的方法是
typedef struct personaldataStruct
{
char name[namesize];
char address[addresssize];
int YearOfBirth;
int MonthOfBirth;
int DayOfBirth;
} PersonalData;
然后声明:
PersonalData x;
作者误导了我吗? 还是两种方法都正确? 请确认。 这是教程http://www.iu.hio.no/~mark/CTutorial/CTutorial.html
两种方法都没有正式的“不正确”之处。
前者声明一个无标签的结构类型,并为该结构类型声明typedef名称PersonalData
。 后者声明了一个结构类型struct personaldataStruct
和该结构类型的同义typedef名称PersonalData
。 声明的personaldataStruct
部分通常称为“结构标签”。
只要您使用PersonalData
typedef名称来引用该结构类型,如
PersonalData x;
您将不会看到两个声明之间的任何区别。 在两种情况下, x
都将声明为相同。
后一种方法为您提供了另一种引用相同结构类型的方法struct personaldataStruct
如果出于某些原因您希望这样做。 例如,使用后一个声明时,您还可以将x
声明为
struct personaldataStruct x;
完全等同于PersonalData x;
宣言。
就我个人而言,我更喜欢将这种方法与struct标签一起使用,因为它为我提供了另一种引用类型的方式,这种方式在某些情况下可能会派上用场(例如,当struct类型必须引用自身时)。 但是在大多数非自我引用的情况下,使用前一种方法将是完美的。
两者都是正确的。 第一种形式(不带标签)唯一真正的问题是,由于typedef名称直到定义末尾才可见,因此无法从其自身的定义中引用该结构。 这是一个普遍的要求; 例如,链表,树或其他类似图的数据结构中的节点通常需要指向相同类型的其他对象。
由于struct标记和typedef名称位于不同的命名空间中 (不要与C ++命名空间混淆),因此无需将它们区分。 对两个都使用相同的标识符是完全可以接受的:
typedef struct PersonalData {
/* ... */
struct PersonalData *next;
} PersonalData;
或者,只要您将同时拥有标签和typedef,就可以向前声明typedef:
typedef struct PersonalData PersonalData;
/* At this point, "struct PersonalData is an incomplete type. */
struct PersonalData {
/* ... */
PersonalData *next;
};
/* And now "struct PersonalData" is a complete type. */
(但是,拼写错误可能会给您留下一个typedef
,它仍然引用从未完成的不完整类型,这会触发可能难以跟踪的错误。复制粘贴是您的朋友。)
还有另一种选择。 您定义的类型已经有一个名称: struct PersonalData
。 typedef
所做的只是为同一类型赋予不同的名称。 能够将单个标识符用作类型名称是很好的做法,但实际上不是必需的。 我自己的偏好是完全省略typedef
,仅将类型称为struct PersonalData
:
struct PersonalData {
/* ... */
struct PersonalData *next;
};
struct PersonalData *head;
struct PersonalData fred;
除非将PersonalData
为不透明类型(意味着使用它的代码不需要知道它是结构),否则显式会有一些优势。
在这一点上,很多人强烈不同意我的观点,并且真的很喜欢对结构使用typedef,就像您可能会在评论中看到的那样。 像这样使用typedef并没有错。 只是没有必要。 您应该准备好阅读使用其他任何一种风格编写的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.