C问题:错误:预期为';)';在'之前*';代币
编辑2 感谢所有的建议,我根据给出的建议编辑了下面的代码。然而,它似乎仍然没有编译。但无论如何,非常感谢你的帮助 编辑 我很抱歉没有将pcb结构放入代码段中。在我最初发布的两个结构上面定义了一个名为pcb的结构。即C问题:错误:预期为';)';在'之前*';代币,c,function,struct,C,Function,Struct,编辑2 感谢所有的建议,我根据给出的建议编辑了下面的代码。然而,它似乎仍然没有编译。但无论如何,非常感谢你的帮助 编辑 我很抱歉没有将pcb结构放入代码段中。在我最初发布的两个结构上面定义了一个名为pcb的结构。即 typedef struct pcb{ UINT32 proc; struct pcb *link; }pcb; 嗨 几分钟前,我问了一个关于C中结构的问题,很快得到了答案。但现在我面临另一个问题,即这个问题的标题错误。我正在尝试使用队列数组在C中实现一个简单的优先
typedef struct pcb{
UINT32 proc;
struct pcb *link;
}pcb;
嗨
几分钟前,我问了一个关于C中结构的问题,很快得到了答案。但现在我面临另一个问题,即这个问题的标题错误。我正在尝试使用队列数组在C中实现一个简单的优先级队列。然而,当我试图在pcb_pQ结构上声明一个函数时,我得到了上面的错误。我在文件中清楚地定义了结构
在头文件中:
typedef struct pcb_Q{
pcb *head;
pcb *tail;
SINT32 size;
} pcb_Q;
typedef struct pcb_pQ {
pcb_Q queues[5];
SINT32 size;
} pcb_pQ;
/*priority queue operations*/
VOID pcb_pq_enqueue(pcb_pQ*, pcb*);
头文件中的函数原型:
typedef struct pcb_Q{
pcb *head;
pcb *tail;
SINT32 size;
} pcb_Q;
typedef struct pcb_pQ {
pcb_Q queues[5];
SINT32 size;
} pcb_pQ;
/*priority queue operations*/
VOID pcb_pq_enqueue(pcb_pQ*, pcb*);
.c文件中的函数推进:
VOID pcb_pq_enqueue(pcb_pQ* pcb_pQ_p, pcb* pcb_p) {
pcb_Q* pcb_Q_p;
int priority;
priority = pcb->proc_priority;
pcb_Q_p = &pcb_pQ->queues[priority];
pcb_enqueue(pcb_Q_p, pcb);
}
当我试图编译上述代码时,我在“*”标记之前得到一个“error:expected')。此错误指向.c文件中的函数签名,即
VOID pcb_pq_enqueue(pcb_pQ* pcb_pQ_p, pcb* pcb_p) {
但我不知道我为什么会犯这个错误,有人能帮我一下吗?非常感谢。是否包含头文件?除非拼写错误,否则该错误几乎总是由缺少typedef引起的 换句话说,编译器不知道
pcb_pQ
或pcb
类型(或两者)
编辑:还有其他错误,因为这样编译很好:
qq.h
typedef struct pcb {
unsigned int proc;
struct pcb *link;
} pcb;
typedef struct{
pcb *head;
pcb *tail;
int size;
} pcb_Q;
typedef struct pcb_pQ {
pcb_Q queues[5];
int size;
} pcb_pQ;
void pcb_pq_enqueue(pcb_pQ*, pcb*);
qq.c:
#include <stdio.h>
#include "qq.h"
void pcb_pq_enqueue(pcb_pQ *pcb_pQ, pcb *pcb) {}
int main (void) { return 0; }
将定义一个
struct pcb
不完整类型,该类型与pcb
(以及您当前定义的结构)不同。编译器似乎没有找到pcb
的定义。首先,它是“void”而不是“void”,直到或除非您有类似的定义
#define VOID void
如果
typedef struct tag_struct_pcb_Q {
pcb *head;
pcb *tail;
SINT32 size;
} pcb_Q;
typedef struct tag_structpcb_pQ {
pcb_Q queues[5];
SINT32 size;
} pcb_pQ;
现代的“C”编译器要求必须提到返回类型
如果您有这样的定义,也会导致错误
#define VOID
另一种可能性
无效pcb_pq_排队(pcb_pq*pcb_pq,pcb*pcb){
pcb来自哪里?拥有pcb*pcb是不好的。始终为变量类型和变量名称指定不同的名称更改:
typedef struct{
UINT32 proc;
struct pcb *link;
}pcb;
致:
PCB定义为哪种类型?我认为对于类型和变量使用相同的名称是一个非常糟糕的想法。如果你区分它们,这将是一个很容易阅读的地方。它似乎来自编译器无法找到PCB*PQ的注释,因为我还有其他使用PCB和PCBYQ的函数,它们没有显示任何问题。每个头定义的结构?我知道这听起来很愚蠢,但我不知道是什么错了,如果我在函数参数中取出pcb_pQ,代码就会显示出来fine@lhw你在用什么编译器?你注意到他粘贴的代码中的大写字母了吗,特别是VOID和UINT32?谢谢你试用,现在我想这可能是编译器的问题..我注意到了使用交叉编译器,而不是通常的gcc。@Tim,我注意到了这一点,但是,如果没有正确声明,他可能会在头文件中出错,而不是在C文件中。@paxdiablo,对不起,我没有捕获到原型。在gcc和clang下,我也编译得很好,令人惊讶的是,pcb未命名并没有给出任何警告。@lhw这会给你一个提示吗使用交叉编译器时有哪些错误?是的,它实际上是在另一个定义文件中定义的,谢谢你的回答。虽然我一开始看到了相同的东西,但是,他在编译c文件时出现了错误。如果
VOID
被破坏,他会在看到函数原型时立即在头中出现错误。为什么不呢但是,在标题中抛出一个错误?我想他可能有一个坏掉的编译器。