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*).
这不是这里的情况,我同意你的看法,它比帮助更令人困惑.
在Linux内核编码风格,说以避免这些类型的类型定义的:
第5章:Typedef
请不要使用"vps_t"之类的东西.
将typedef用于结构和指针是错误的.当你看到一个
Run Code Online (Sandbox Code Playgroud)vps_t a;在源头,这是什么意思?
相反,如果它说
Run Code Online (Sandbox Code Playgroud)struct virtual_container *a;你实际上可以告诉"a"是什么.