![](/img/trans.png)
[英]What's the difference between `typedef struct X { }` and `typedef struct { } X`?
[英]Typedef struct declared as two types: “typedef struct x { .. } X, *XPointer”
对不起,如果之前有人询问,我甚至不确定要搜索什么来提出这个问题。
当我创建一个typedef struct
,我通常做这样的事情:
typedef struct myStruct {
int a;
int b;
struct myStruct *next;
} MyStruct;
所以我最后用MyStruct
声明它。 然后,当我创建将其作为参数传递的函数时,我写道
int doSomething(MyStruct *ptr){
}
然而,我对一个项目的朋友合作,我所遇到他的编码风格,这也宣告*MyStructP
是这样的:
typedef struct myStruct {
int a;
int b;
struct myStruct *next;
} MyStructR, *MyStructP;
然后他在他的函数中使用MyStructP
,所以他的参数看起来像:
int doSomething(MyStructP)
所以他不必在参数列表中使用*
。 这让我很困惑,因为当我查看参数列表时,我总是寻找*
以确定arg是否是指针。 最重要的是,我正在创建一个函数,它接受我创建的结构和他创建的结构,所以我的arg有*而他的没有。 超级混乱!!
有人可以就两者之间的差异提供见解/比较/建议吗? 优点? 缺点? 哪种方式更好或更差,还是更广泛使用? 任何信息都可以。 谢谢!
通常认为在typedef后面隐藏指针的风格很差,除非它们是不透明的句柄(例如SDL_GLContext
是void*
)。
这不是这里的情况,我同意你的看法,它比帮助更令人困惑。
Linux内核编码风格说要避免这些类型的def:
第5章:Typedef
请不要使用“vps_t”之类的东西。
将typedef用于结构和指针是错误的 。 当你看到一个
vps_t a;
在源头,这是什么意思?
相反,如果它说
struct virtual_container *a;
你实际上可以告诉“a”是什么。
人们偶尔使用typedef指针的主要原因是将类型表示为程序员的“黑盒子对象”,并允许将来更容易地更改其实现。
例如,今天可能类型是指向结构的指针,但明天该类型将成为某些表的索引,某种类型的句柄/键或文件描述符。 Typedef这样告诉程序员他们不应该尝试他们通常对指针做的事情,比如将它与0 / NULL进行比较,解除引用它(例如 - 直接访问成员),递增它等等,作为它们的代码将来可能会被打破。 当然,使用命名约定(例如您的朋友),会显示并编码底层实现实际上是指针与此目的冲突。
这样做的另一个原因是不太可能出现这种错误:
myStructR *ptr1, ptr2;
myStructP ptr3, ptr4;
这是非常弱的问题,因为编译器通常会在以后捕获您滥用ptr2
,但这是执行此操作的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.