我为什么要这样做?
如果我想创建一个对象,我应该使用Frame_s还是Frame_t?
typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;
如果我想创建一个对象,我应该使用Frame_s还是Frame_t?
您需要使用Frame_t
。
使用typedef
关键字,您可以将Frame_t
和struct Frame_s
定义为完全相同的类型。
因此,以下这些句子是等效的:
// 1
Frame_t f;
// 2
struct Frame_s f;
我会使用:
typedef struct
{
int x;
int y;
int z;
} Frame_t;
我总是这样声明变量:
Frame_t f1, f2, f3;
通常混淆来自于你在一个 C++ 代码块中使用该句子的地方。如果你在使用 typedef
的 C++ 中,可以使用以下任一方式:
// 1
Frame_t f;
// 2
Frame_s f;
但是如果你使用普通的C编译器,那么//2
就是无效的。
你可以使用struct Frame_s
或者Frame_t
。
通常情况下,你会使用typedef来定义一个别名Frame_t
,这样你就不需要在引用该类型时每次都写上struct
。
除了Frame_t
比struct Frame_s
短一些外,它们并没有实质上的差别。
typedef
的另一个方面,在其他回答中还没有提到的是它可以保留标识符,从而避免混淆。如果你这样做一个前向声明
typedef struct Frame Frame;
你应该避免使用相同的名称Frame
,例如变量或函数。
一个非常糟糕的传统例子是POSIX中的"sys/stat.h":它定义了一个struct stat
和一个函数stat
:
int stat(const char *path, struct stat *buf);
所以这两个声明是等价的:
struct Frame_s f;
Frame_t f;
Frame_s
,因为它不是必需的。typedef struct
{
int x;
int y;
int z;
} Frame_t;
struct Frame_s foo
或Frame_t foo
(后者更常见,因为这就是typedef的全部意义)。我猜Frame_s
表示结构体类型本身,而Frame_t
是通常用于Frame值的普通类型。struct Frame_s
名称。该结构体可以有一个成员 struct Frame_s* pointer;
,但不能是 Frame_t* pointer;
。 - David Thornleytypedef
用作缩略语。因此,当一个函数返回这种类型的结构时,通常会编写 -
struct Frame_s *function_name()
代码开始变得混淆。函数定义变得冗长等等。通过使用 typedef
,您可以获得 -
Frame_t *function_name()
整洁的代码!这在维护中有很大的区别...