Typedef结构问题

时间:2010-10-01 17:51:34

标签: c struct typedef

我为什么要这样做?

typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;

另外,如果我想创建一个对象,我该使用Frame_s还是Frame_t?

6 个答案:

答案 0 :(得分:6)

您可以使用Frame_t

使用typedef,您说Frame_tstruct 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 fooFrame_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;