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的系统会将其保留给自己的实现。