作为回答另一个问题的一部分,我遇到了这样的一段代码,gcc 编译时没有抱怨。
typedef struct {
struct xyz *z;
} xyz;
int main (void) {
return 0;
}
这是我一直用来构造指向自身的类型(例如,链表)的方法,但我一直认为您必须为结构命名,以便可以使用自引用。换句话说,您不能xyz *z
在结构中使用,因为此时 typedef 尚未完成。
但是这个特定的示例没有命名结构,它仍然可以编译。我最初认为编译器中有一些黑魔法会自动翻译上述代码,因为结构和 typedef 名称是相同的。
但这个小美女也很有效:
typedef struct {
struct NOTHING_LIKE_xyz *z;
} xyz;
我在这里想念什么?这似乎是一个明显的违规行为,因为在任何地方都没有struct NOTHING_LIKE_xyz
定义类型。
当我将它从指针更改为实际类型时,我得到了预期的错误:
typedef struct {
struct NOTHING_LIKE_xyz z;
} xyz;
qqq.c:2: error: field `z' has incomplete type
此外,当我删除 时struct
,我得到一个错误(parse error before "NOTHING ...
)。
这在 ISO C 中是否允许?
更新: Astruct NOSUCHTYPE *variable;
也可以编译,因此它不仅仅是在它似乎有效的结构内部。我在 c99 标准中找不到任何允许对结构指针宽大的东西。