定义结构体问题

3
我为什么要这样做?
typedef struct Frame_s
{
int x;
int y;
int z;
} Frame_t;

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

你应该避免在自己的类型中使用“_t”后缀,因为基于POSIX的系统将其保留用于它们自己的实现。 - mocj
6个回答

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;

我总是这样声明变量:

Frame_t f1, f2, f3;

通常混淆来自于你在一个 C++ 代码块中使用该句子的地方。如果你在使用 typedefC++ 中,可以使用以下任一方式:

// 1
Frame_t f;

// 2
Frame_s f;

但是如果你使用普通的C编译器,那么//2就是无效的。


2

你可以使用struct Frame_s或者Frame_t

通常情况下,你会使用typedef来定义一个别名Frame_t,这样你就不需要在引用该类型时每次都写上struct

除了Frame_tstruct Frame_s短一些外,它们并没有实质上的差别。


1

typedef 的另一个方面,在其他回答中还没有提到的是它可以保留标识符,从而避免混淆。如果你这样做一个前向声明

typedef struct Frame Frame;

你应该避免使用相同的名称Frame,例如变量或函数。

一个非常糟糕的传统例子是POSIX中的"sys/stat.h":它定义了一个struct stat和一个函数stat

int stat(const char *path, struct stat *buf);

0

所以这两个声明是等价的:

struct Frame_s f;
Frame_t f;

实际上,你现在可以在声明中省略Frame_s,因为它不是必需的。
typedef struct
{
  int x;
  int y;
  int z;
} Frame_t;

0
声明结构体的值,您可以使用struct Frame_s fooFrame_t foo(后者更常见,因为这就是typedef的全部意义)。我猜Frame_s表示结构体类型本身,而Frame_t是通常用于Frame值的普通类型。

1
如果结构体包含指向自身的指针,则需要使用 struct Frame_s 名称。该结构体可以有一个成员 struct Frame_s* pointer;,但不能是 Frame_t* pointer; - David Thornley

0

typedef 用作缩略语。因此,当一个函数返回这种类型的结构时,通常会编写 -

struct Frame_s *function_name()

代码开始变得混淆。函数定义变得冗长等等。通过使用 typedef ,您可以获得 -

Frame_t *function_name()

整洁的代码!这在维护中有很大的区别...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接