我为什么要这样做?
typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;
另外,如果我想创建一个对象,我该使用Frame_s还是Frame_t?
答案 0 :(得分:6)
您可以使用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;
并且总是声明我的vars:
Frame_t f1, f2, f3;
混淆通常来自您在 C ++ 代码段中使用该句子的地方。如果您对typedef
使用 C ++ ,则可以使用:
// 1
Frame_t f;
// 2
Frame_s f;
但如果您使用普通的 C 编译器,则//2
无效。
答案 1 :(得分:2)
您使用struct Frame_s
,或使用Frame_t
。
通常你会这样做一个typedef,这样你就可以使用typedefed名称Frame_t
,而不必在你引用类型时写struct
。
除了Frame_t
短于struct Frame_s
之外,没有真正的区别。
答案 2 :(得分:1)
其他回复中尚未提及的typedef
的另一个方面是它保留了标识符,因此可以避免混淆。如果你做那样的前瞻声明
typedef struct Frame Frame;
你会避免使用可能使用相同名称Frame
的某些代码,例如变量或函数。
一个非常糟糕的传统例子是POSIX中的“sys / stat.h”:它定义了struct stat
和函数stat
:< / p>
int stat(const char *path, struct stat *buf);
答案 3 :(得分:0)
要声明结构的值,您可以使用struct Frame_s foo
或Frame_t foo
(后者更正常,因为这是typedefing的全部要点)。我的猜测是Frame_s
表示结构类型本身,而Frame_t
是通常用于Frame值的普通类型。
答案 4 :(得分:0)
typedef
用作简短形式。所以当一个函数返回这种类型的结构时,通常你会写 -
struct Frame_s *function_name()
代码开始变得混淆。函数定义变长等等。使用此typedef
得到 -
Frame_t *function_name()
清洁代码!在维护方面有很大的不同......
答案 5 :(得分:0)
所以这两个声明是等价的:
struct Frame_s f;
Frame_t f;
事实上,您现在可以将Frame_s
从声明中删除,因为它不需要。
typedef struct
{
int x;
int y;
int z;
} Frame_t;