c - 为什么这个结构类型“不完整”,它真的用指针解决了吗?
问题描述
我已经定义了这些结构。
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;
摆脱这个错误。是什么导致了这个错误,并且将该成员更改为指针真的可以解决问题,还是只是将其隐藏在编译器中?
解决方案
在编译器看到的地方:
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>
推荐阅读
- google-apps-script - 如何在 Pipedrive 中循环分页以获得所有交易?
- apache - 将Web应用程序转换为exe文件
- python - 涉及“in”和“==”的Python操作顺序
- grep - grep:查找包含单词“star”但不包含单词“start”的所有文件
- javascript - 为什么更改子组件中的状态(基于道具)会影响道具?
- docker - 如何使用桥接网络打开 docker 容器的端口
- c++ - 将一维RGB字节数组转换为c++位图
- ruby-on-rails - devise_token_auth 是否使用 JSON 网络令牌?
- mysql - 在sql中选择具有相同id的最高数字
- c - 如何在点阵 74HC595 上打开具有特定地址的 LED?