C结构的类型不完整
我正在尝试采取RRhead,在RRhead有一个新的RCB点作为下一个,在新的RCB有RRhead点作为前一个C结构的类型不完整,c,C,我正在尝试采取RRhead,在RRhead有一个新的RCB点作为下一个,在新的RCB有RRhead点作为前一个 typedef struct{ int sequence_number; int file_descriptor; FILE *requested_file; int bytes_remaining; int quantum; struct RCB *next; struct RCB *prior; } RCB; typedef struct RCB RC
typedef struct{
int sequence_number;
int file_descriptor;
FILE *requested_file;
int bytes_remaining;
int quantum;
struct RCB *next;
struct RCB *prior;
} RCB;
typedef struct RCB RCB;
RCB *RRhead = NULL;
static void admit_to_scheduler_RR(int fd, FILE *fin){
int sequence_counter, new_bytes_remaining, new_quantum = 0;
RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
RRhead->prior = &new_rcb;
RRhead = &new_rcb;
sequence_counter++;
}
产生以下错误:
sws.c: In function ‘admit_to_scheduler_RR’:
sws.c:318:10: error: variable ‘new_rcb’ has initializer but incomplete type
struct RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
^
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:10: warning: excess elements in struct initializer [enabled by default]
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default]
sws.c:318:14: error: storage size of ‘new_rcb’ isn’t known
struct RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
^
sws.c:319:9: error: dereferencing pointer to incomplete type
RRhead->prior = &new_rcb;
^
我不知道为什么我会收到过量元素的警告。我没有正确初始化新的\u rcb吗?我是否需要创建它,然后将所有字段设置为我想要的
我相信这一切都与新农村合作银行的“不完整类型”有关。大多数谷歌搜索表明这是因为编译器不知道RCB的大小应该是多少。这似乎表明我需要将此结构定义放入头中。这是绝对必要的吗?在第一条语句中,您使用
typedef
将RCB
声明为struct
。紧接着,您会说,‘顺便说一句,RCB
意味着struct RCB
’,这一点还没有定义!(要使其存在,您必须说struct RCB{…};
)
基本上,删除
typedef结构RCB RCB
将消除相关错误,但会弹出新错误。在第一条语句中,您使用typedef
将RCB
声明为struct
。紧接着,您会说,‘顺便说一句,RCB
意味着struct RCB
’,这一点还没有定义!(要使其存在,您必须说struct RCB{…};
)
基本上,删除
typedef结构RCB RCB代码>将删除相关错误,但会弹出新错误。尝试将结构更改为以下内容(即删除typedef关键字):
更多信息可在本答案中阅读。尝试将结构更改为以下内容(即删除typedef关键字):
更多信息可在以下答案中阅读。尝试以下方法:
typedef struct RCB RCB;
strutc RCB {
....
C中的“tag”名称空间(与struct
和union
一起出现)与标识符名称空间不同。您还可以使用typedef将标识符RCB
与类型struct RCB
相关联 试试这样的方法:
typedef struct RCB RCB;
strutc RCB {
....
#include <stdio.h>
#include <stdlib.h>
typedef struct RCB RCB;
typedef struct RCB {
int sequence_number;
int file_descriptor;
FILE *requested_file;
int bytes_remaining;
int quantum;
RCB *next;
RCB *prior;
} RCB;
RCB new_rcb = {11, 21, NULL, 31, 41, NULL, NULL};;
static void admit_to_scheduler_RR(int fd, FILE *fin) {
int sequence_counter = 0;
int new_bytes_remaining, new_quantum = 0;
RCB *RRhead = &new_rcb;
RRhead->prior = &new_rcb;
sequence_counter++;
}
int main(int argc, char *argv[]) {
admit_to_scheduler_RR(1, NULL);
return 0;
}
C中的“tag”名称空间(与struct
和union
一起出现)与标识符名称空间不同。您还可以使用typedef将标识符RCB
与类型struct RCB
相关联 #包括
#include <stdio.h>
#include <stdlib.h>
typedef struct RCB RCB;
typedef struct RCB {
int sequence_number;
int file_descriptor;
FILE *requested_file;
int bytes_remaining;
int quantum;
RCB *next;
RCB *prior;
} RCB;
RCB new_rcb = {11, 21, NULL, 31, 41, NULL, NULL};;
static void admit_to_scheduler_RR(int fd, FILE *fin) {
int sequence_counter = 0;
int new_bytes_remaining, new_quantum = 0;
RCB *RRhead = &new_rcb;
RRhead->prior = &new_rcb;
sequence_counter++;
}
int main(int argc, char *argv[]) {
admit_to_scheduler_RR(1, NULL);
return 0;
}
#包括
类型定义结构RCB RCB;
类型定义结构RCB{
整数序列号;
int文件描述符;
文件*请求的文件;
剩余的int字节;
int量子;
RCB*下一步;
RCB*之前;
}RCB;
RCB new_RCB={11,21,NULL,31,41,NULL,NULL};;
静态无效允许到调度程序(int fd,文件*fin){
int序列_计数器=0;
int剩余新字节,新量子=0;
RCB*RRhead=&new_RCB;
RRhead->previor=&new\u rcb;
序列_计数器++;
}
int main(int argc,char*argv[]){
允许\u到\u调度程序\u RR(1,空);
返回0;
}
要修复错误,您需要将代码更改为与上面类似的内容,即使用数据结构和编译 #包括
#包括
类型定义结构RCB RCB;
类型定义结构RCB{
整数序列号;
int文件描述符;
文件*请求的文件;
剩余的int字节;
int量子;
RCB*下一步;
RCB*之前;
}RCB;
RCB new_RCB={11,21,NULL,31,41,NULL,NULL};;
静态无效允许到调度程序(int fd,文件*fin){
int序列_计数器=0;
int剩余新字节,新量子=0;
RCB*RRhead=&new_RCB;
RRhead->previor=&new\u rcb;
序列_计数器++;
}
int main(int argc,char*argv[]){
允许\u到\u调度程序\u RR(1,空);
返回0;
}
要修复错误,您需要将代码更改为与上面类似的内容,即使用数据结构和编译 typedef结构RCB RCB代码>尝试删除导致此函数中出现不同错误的内容。typedef struct RCB RCB代码>尝试删除导致此函数中出现不同错误的代码。