我是C编程的初学者,但我想知道typedef在定义结构时使用与使用结构之间有什么区别typedef.在我看来,实际上没有区别,他们实现了同样的目标.
struct myStruct{
int one;
int two;
};
Run Code Online (Sandbox Code Playgroud)
与
typedef struct{
int one;
int two;
}myStruct;
Run Code Online (Sandbox Code Playgroud) 作为回答另一个问题的一部分,我遇到了一段这样的代码,gcc编译时没有抱怨.
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我一直用来构造指向自己的类型的方法(例如,链接列表),但我一直认为你必须命名结构,以便你可以使用自引用.换句话说,您无法xyz *z在结构中使用,因为此时typedef尚未完成.
但是这个特定的样本没有命名结构,它仍然编译.我原本认为编译器中有一些黑魔法会自动翻译上面的代码,因为结构和typedef名称是相同的.
但是这个小小的美也可以:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?这似乎是一个明显的违规,因为没有任何struct NOTHING_LIKE_xyz类型定义.
当我从指针更改为实际类型时,我得到预期的错误:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
Run Code Online (Sandbox Code Playgroud)
此外,当我删除struct,我得到一个错误(parse error before "NOTHING ...).
这是否允许在ISO C中?
更新:A struct NOSUCHTYPE *variable;也编译,因此它不仅仅是内部结构似乎是有效的.我在c99标准中找不到任何允许结构指针宽大的东西.