C结构的类型不完整

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

我正在尝试采取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 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尝试删除导致此函数中出现不同错误的代码。