我需要一些帮助来理解这个结构:
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
使用typedef
我知道我只能使用std_fifo
而不是在我的代码中编写struct std_fifo
。但是*fifo
?
答案 0 :(得分:3)
代码
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
创建两个(命名非常严重)typedef名称std_fifo
和fifo
。
typedef名称std_fifo
等同于struct std_fifo
类型,可用于代替struct std_fifo
:
std_fifo fifo_instance; // creates an instance of struct std_fifo
std_fifo get_fifo(); // declares get_fifo as a function returning an
// instance of struct std_fifo
void read_fifo( std_fifo * );// declares a function taking parameter of type
// pointer to struct std_fifo
typedef名称fifo
等同于struct std_fifo *
类型,可用于代替struct std_fifo *
:
fifo fifo_ptr; // creates a pointer to an instance of struct std_fifo
fifo get_fifoptr(); // declares get_fifoptr as a function returning a pointer
// to an instance of struct std_fifo
void read_fifo( fifo ); // declares a function taking a parameter of type
// struct std_fifo *
原因代码如
typdef struct std_fifo { ... } std_fifo;
的作用是因为C为标识符提供了四个不同的名称空间:标签,标签名称,struct
和union
成员名称以及其他所有内容。 标记名称 std_fifo
始终以struct
关键字开头,这是编译器将其与std_fifo
typedef名称区分开来的方式。
关于使用typedef的一些建议:
虽然在某些情况下它们可以帮助您更好地扫描代码,但使用typedef实际上可能会模糊您的意图并使类型更难使用。如果该类型的用户必须知道其表示(例如访问struct
的成员,或取消引用指针类型,或在printf
或{中使用正确的转换说明符{1}}调用,或者在属性上调用函数等),然后你应该不隐藏typedef背后的表示。
如果您决定做想隐藏typedef背后的类型表示,那么您还应该为涉及该类型的任何操作提供完整的API。 C使用scanf
类型执行此操作;而不是直接操作FILE
对象,而是将指针传递给各种FILE
例程。因此,如果您决定隐藏typedef名称stdio
后面的struct std_fifo *
,那么您还应该创建一个API:
fifo
抽象可能是一件好事,但“漏洞”抽象比没有抽象更糟糕。
答案 1 :(得分:1)
结构的有效定义是赋予名称和指针。
typedef struct std_fifo{
char* name;
struct std_fifo* next;
}std_fifo, *fifo;
在此代码中,std_fifo
是结构,*fifo
是指向此结构的指针。
我强烈建议您在这里查看:http://www.cplusplus.com/forum/windows/57382/