C 类型定义结构问题

C 类型定义结构问题,c,struct,typedef,C,Struct,Typedef,我为什么要这么做 typedef struct Frame_s { int x; int y; int z; } Frame_t; 另外,如果我想创建一个对象,我应该使用什么框架或框架?您将使用框架 使用typedef可以说Frame\u t和struct Frame\u s是完全相同的类型 这些句子是等价的: // 1 Frame_t f; // 2 struct Frame_s f; 我将使用: typedef struct { int x; int y; int z

我为什么要这么做

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

另外,如果我想创建一个对象,我应该使用什么框架或框架?

您将使用
框架

使用
typedef
可以说
Frame\u t
struct Frame\u s
完全相同的类型

这些句子是等价的:

// 1
Frame_t f;

// 2
struct Frame_s f;
我将使用:

typedef struct
{
   int x;
   int y;
   int z;
} Frame_t;
并且总是这样声明我的VAR:

Frame_t f1, f2, f3;
混淆通常来自于在C++代码段中使用该句子的地方。如果将C++
typedef
一起使用,则可以使用:

// 1
Frame_t f;

// 2
Frame_s f;

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

要么使用
结构框架
,要么使用
框架

通常,您这样做是为了使用typedef名称,
Frame\t
,而不必在引用类型时写入
struct


除了
Frame\u t
struct-Frame\u s
短之外,没有真正的区别。

要声明struct的值,可以使用
struct-Frame\u-s-foo
Frame\u-foo
(后者更正常,因为这是typedefing的全部要点)。我的猜测是,
Frame\u s
表示结构类型本身,而
Frame\u t
是通常用于帧值的普通类型。

typedef
用作缩写形式。所以当一个函数返回这种类型的结构时,通常你会写-

struct Frame\u s*function\u name()

代码开始变得模糊。函数定义变长等。使用此
typedef

Frame\u t*函数名()


干净的代码!在维护方面有很大区别…

因此这两个声明是等效的:

struct Frame_s f;
Frame_t f;
事实上,您现在可以将
Frame_s
保留在声明之外,因为它是不需要的

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

其他回复中尚未提及的
typedef
的另一个方面是它保留了标识符,因此可以避免混淆。如果你这样做的话

typedef struct Frame Frame;
您可以避免某些代码可能使用相同的名称
Frame
,例如变量或函数

POSIX中出现的一个非常糟糕的传统示例是“sys/stat.h”:它定义了一个
struct stat
和一个
stat
函数:

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

如果结构包含指向自身的指针,则它需要有一个
struct Frame\s
名称。该结构可以有一个成员
struct Frame\u s*指针,但不是
帧指针。您可能应该避免为自己的类型使用“\u t”后缀,因为基于POSIX的系统会将其保留给自己的实现。