Typedef结构声明为两种类型:"typedef struct x {..} X,*XPointer"

krb*_*686 10 c struct pointers

对不起,如果之前有人询问,我甚至不确定要搜索什么来提出这个问题.

当我创建一个时typedef struct,我通常做这样的事情:

typedef struct myStruct {
  int a;
  int b;
  struct myStruct *next;
} MyStruct;
Run Code Online (Sandbox Code Playgroud)

所以我最后宣布它MyStruct.然后,当我创建将其作为参数传递的函数时,我写道

int doSomething(MyStruct *ptr){

}
Run Code Online (Sandbox Code Playgroud)

然而,我对一个项目的朋友合作,我所遇到他的代码风格,这是声明*MyStructP是这样的:

typedef struct myStruct {
  int a;
  int b;
  struct myStruct *next;
} MyStructR, *MyStructP;
Run Code Online (Sandbox Code Playgroud)

然后他MyStructP在他的函数中使用,所以他的参数看起来像:

int doSomething(MyStructP)
Run Code Online (Sandbox Code Playgroud)

所以他不必*在参数列表中使用.这让我很困惑,因为当我查看参数列表时,我总是寻找*确定arg是否为指针的方法.最重要的是,我正在创建一个函数,它接受我创建的结构和他创建的结构,所以我的arg有*而他的没有.超级混乱!!

有人可以就两者之间的差异提供见解/比较/建议吗?优点?缺点?哪种方式更好或更差,还是更广泛使用?任何信息都可以.谢谢!

Que*_*tin 12

通常认为隐藏在typedef后面的指针的风格很差,除非它们是不透明的句柄(例如SDL_GLContext是a void*).
这不是这里的情况,我同意你的看法,它比帮助更令人困惑.


eca*_*mur 9

Linux内核编码风格,说以避免这些类型的类型定义的:

第5章:Typedef

请不要使用"vps_t"之类的东西.

将typedef用于结构和指针是错误的.当你看到一个

vps_t a;
Run Code Online (Sandbox Code Playgroud)

在源头,这是什么意思?

相反,如果它说

struct virtual_container *a;
Run Code Online (Sandbox Code Playgroud)

你实际上可以告诉"a"是什么.

  • 这很有趣,我们前几天还有一些关于这一点的来回走动.我完全同意,并提出了使用`typedef`时带来的不便,它使未来的实例化在vim中变得无色! (2认同)