相关疑难解决方法(0)

typedef struct vs struct definitions

我是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)

c struct typedef

763
推荐指数
10
解决办法
66万
查看次数

如何在结构中引用未定义的类型是合法的?

作为回答另一个问题的一部分,我遇到了一段这样的代码,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标准中找不到任何允许结构指针宽大的东西.

c struct undefined language-lawyer

8
推荐指数
2
解决办法
2120
查看次数

标签 统计

c ×2

struct ×2

language-lawyer ×1

typedef ×1

undefined ×1