很抱歉,如果之前有人问过这个问题,我甚至不知道该找什么来解决这个问题。
当我创建一个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有*,而他的没有。太混乱了!!
有人能对两者之间的差异给出见解/比较/建议吗?专业人士?犯人?哪一种方式更好或更糟,还是更广泛地使用?任何信息。谢谢!
发布于 2015-02-23 15:46:01
Linux内核编码风格说为了避免这种类型的类型:
第5章: Typedefs 请不要使用像"vps_t“这样的东西。 在结构和指针中使用typedef是错误的。当你看到 vps_t a; 在源头上,这意味着什么? 相反,如果它说 结构virtual_container *a; 你实际上可以分辨出"a“是什么。
发布于 2015-02-23 15:37:28
将指针隐藏在类型防御后面通常被认为是糟糕的样式,除非指针应该是不透明的句柄(例如,SDL_GLContext是void*)。
在这里不是这样的,我同意你的看法,这比帮助更令人困惑。
发布于 2015-02-23 15:38:13
有些人在命名变量时喜欢使用匈牙利符号的想法。有些人在命名类型时,会把这个概念做得更深入。
我觉得这是品味的问题。
但是,我认为它掩盖了一些事情(比如在您的例子中),因为您必须挖掘名称的声明,才能找到它的类型。我希望事情是显而易见的和明确的,我会避免这样的类型名称。
(请记住,typedef没有引入新类型,而只是引入了新类型别名的新名称。)
https://stackoverflow.com/questions/28677318
复制相似问题