C typedef结构的使用

C typedef结构的使用,c,struct,include,typedef,C,Struct,Include,Typedef,我想知道在性能、声明等方面是否有任何差异 我有一个叫做features.h的文件, 它有一个结构定义: typedef struct feat_record { ... ... } Feature; 我想在方法中的另一个文件中使用它,在另一个文件.h文件中我包含features.h。 我的问题是,如果像这样在另一个文件.h中声明方法有区别: void myMethod(Feature *f); void myMethod (struct feat_record *f); 或者像这样:

我想知道在性能、声明等方面是否有任何差异

我有一个叫做features.h的文件, 它有一个结构定义:

typedef struct feat_record
{
 ...
 ...
} Feature;
我想在方法中的另一个文件中使用它,在另一个文件.h文件中我包含features.h。 我的问题是,如果像这样在另一个文件.h中声明方法有区别:

void myMethod(Feature *f);
void myMethod (struct feat_record *f);
或者像这样:

void myMethod(Feature *f);
void myMethod (struct feat_record *f);

感谢

不同之处在于,功能的typedef声明必须在使用它的功能声明之前,其中可能包括或可能不包括feat_记录的定义,而

void myMethod (struct feat_record *f);
作为接口声明独立存在;它不依赖于前面的typedef或其他声明

不过,最好声明struct feat_记录;首先,如果只是为了平息不可避免的编译器警告。在实现myMethod的文件中的函数声明之前需要这样一个声明

归根结底,区别在于风格,即冗长性:您应该决定是否要在程序中将所有结构都称为struct。这意味着更多的输入,但作为一个提醒初始化的事情。或者,如果您愿意,可以使用元数据标记来表示必须作为结构处理的内容


至于编译的程序,没有任何可以想象的区别。

这只是编码风格,除了主观的、个人的偏好之外,没有其他区别

TyEuff版本通常鼓励在C和C++之间的边界中的程序,因为它使C++中的C++风格与Cype类型一致,所以在声明Stutt对象时,Stutt关键字是多余的。 struct-tag版本主要受Linux阵营的鼓励,并由Linux内核代码风格指南强制执行,该指南除了主观观点之外,没有提供太多的理由


没有明显的对与错,只要选择你喜欢的风格并始终如一地坚持下去。

注意,你不需要两个不同的名字。typedef专长记录{…}专长记录;很好。@hit:你说的好像语法不重要一样。@OliCharlesworth你忘了一个结构吗?这看起来不正确。@OliCharlesworth你不需要重复。。。typedef结构{…}功能记录;很好。如果专长记录包含指向自身的指针,请使用typedef专长记录专长记录;结构专长记录{…};哎呀,让typedef结构feat_记录feat_记录;它确实需要一个前面的结构声明,不管它是完整的还是不完整的,因此它实际上并不比typedef更独立。这只是主观的编码风格。@ LundIn,它是C++语言中的一个详细的类型说明符,不确定C术语,也不需要任何前面的声明。如果你对任何类型都没有定义,你就不能访问指向的内容。您还将收到大量编译器警告。只有在实现不透明类型时,这样编写代码才有意义,但如果实现了不透明类型,则无论如何都需要该类型的全局文件范围声明。那么这里的优势到底是什么呢?@Lundin啊,它被称为标签。见C11§6.7.2.1/8。你在说什么?你说它需要前面的声明,但它没有。那是错误的。它具有结构的正向声明的效果。好的,它不需要正向声明,但它仍然是一个不完整的类型,仅在该函数中局部有效。在现实世界中,谁会因此而更快乐?如前所述,我想不出它在任何情况下都是有用的。除了主观之外,没有其他区别——这不是完全正确的。从语言的角度来看,确实没有区别。但某些编码风格背后的原因是客观的差异:1如果使用结构形式,就无法轻松地将类型更改为基本类型。2使用typedef表单隐藏了这样一个事实,即复制它可能会很昂贵。3你注意到自己与C++的一致性。我想还有更多的考虑。@Elazar 1我真的不知道typedef如何让这变得更容易。类型与C语言中的有限类型安全性有关。2有了这个参数,您还应该显式地写出枚举,以表明它们并不昂贵。但这真的不是问题。。。一个复制未知数据并因此而导致性能问题的程序员,只能怪他们自己。大多数初学者都知道他们应该通过引用函数来传递未知类型,例如。@Elazar 3不一定是件好事。假设我们有一个包含指针的结构,它是为C编写的,但是C++中编译成了一个公共类。然后,最好表明代码是为C编写的,并且是为C编写的,表明没有考虑结构/类的构造函数或复制ctr/赋值运算符/析构函数。总而言之,我认为这些论点都是相当主观的,只在个案基础上有效
我说,以前的结构现在是int。现在你必须在代码中的任何地方都从struct bla更改为int。你使结构成为类型接口的一部分,就像使用任何裸原语一样有效;这就是typedef的用途。如果你所说的是客观原因不明确或根本不重要,那么这个决定基本上是一个品味问题,我同意。如果说某件事不一定是好事,那就意味着它可能有一些负面价值。