首页 > 解决方案 > 为什么这个结构类型“不完整”,它真的用指针解决了吗?

问题描述

我已经定义了这些结构。

struct http_req {
    struct http_req_line rl;
}

struct http_req_line {
    enum method {
        OPTIONS,
        GET,
        HEAD,
        POST,
        PUT,
        DELETE,
        TRACE,
        CONNECT
    } method;
    enum uri_type {
        ASTERISK,
        ABSOLUTEURI,
        ABS_PATH,
        AUTHORITY
    } uri_type;
    union req_uri {
        char asterisk[1];
        char absoluteURI[256];
        char abs_path[256];
        char authority[256];
    } req_uri;
    char http_ver[16];
};

当我编译包含这个头文件的文件时(它自己编译得很好),gcc给了我这个

request_types.h:2:23: error: field ‘rl’ has incomplete type
  struct http_req_line rl;

但是将标题的第二行更改为

struct http_req_line *rl;

摆脱这个错误。是什么导致了这个错误,并且将该成员更改为指针真的可以解决问题,还是只是将其隐藏在编译器中?

标签: cgccdata-structuresstruct

解决方案


在编译器看到的地方:

struct http_req {
    struct http_req_line rl;
}

没有关于 astruct http_req_line是什么的信息。您需要结构定义struct http_req出现在 的定义之后struct http_req_line。您可以使用指针(指向不完整的类型);你不能使用结构的副本。

请参阅 C11 标准§6.7.2.1 结构和联合说明符

结构或联合不应包含不完整或函数类型的成员(因此,结构不应包含自身的实例,但可能包含指向自身实例的指针),...</p>


推荐阅读