【问题标题】:C question: error: expected ')' before '*' tokenC 问题:错误:在 '*' 标记之前应有 ')'
【发布时间】:2010-05-24 05:40:02
【问题描述】:

编辑 2

感谢所有建议,我根据给出的建议编辑了下面的代码。但是,它似乎仍然无法编译。尽管如此,还是非常感谢您的帮助。

编辑

我很抱歉没有将 pcb 结构放入代码 sn-p。在我最初发布的两个结构上面定义了一个名为 pcb 的结构。即,

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*);

.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);
}

当我尝试编译上述代码时,我在 '*' 标记之前收到“错误:预期的 ')'。这个错误指向.c文件中的函数签名,即

VOID pcb_pq_enqueue(pcb_pQ* pcb_pQ_p, pcb* pcb_p) {

但我不确定为什么会出现此错误,有人可以帮帮我吗?非常感谢。

【问题讨论】:

  • pcb在哪里定义为type?
  • 我认为对类型和变量使用相同的名称是一个非常糟糕的主意。如果你能把它们区分开来,阅读起来会容易得多。
  • 从 cmets 看来,编译器找不到 pcb_pQ,因为我还有其他使用 pcb 和 pcb_Q 的函数,它们没有显示任何问题。有没有像每个标题定义的最大结构数之类的东西?我知道这听起来很愚蠢,但我就是不知道怎么回事
  • 如果我取出函数参数中的pcb_pQ,代码编译得很好
  • @lhw 你用的是什么编译器?

标签: c function struct


【解决方案1】:

你是否包含头文件?除非拼写错误,否则该错误几乎总是由缺少 typedef 引起的。

换句话说,编译器不知道pcb_pQpcb 类型(或两者)。


编辑:还有其他问题,因为编译得很好:

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; }

我不得不使用其他类型(并且我将 pcb 结构修改为已命名的结构 - 我不确定您给定的结构是否应该按原样编译,因为不存在 struct pcb 类型) .


根据迄今为止的所有 cmets 和答案,我很确定您的编译器有问题。 GCC 编译上面那个 sn-p 就好了。

尝试将我上面的两个文件放到你的系统上,看看它们是否可以编译。

请注意,您确实需要命名您的pcb 结构。有关血腥细节,请参阅here,但共识似乎是这样的

    typedef struct {
        unsigned int proc;
        struct pcb *link;
    } pcb;

将定义一个 struct pcb 不完整类型,该类型不同于 pcb(以及您当前定义的结构)。

【讨论】:

  • 您是否注意到他粘贴的代码中的大写字母,特别是 VOID 和 UINT32?
  • 感谢您试用,现在我认为这可能是编译器问题.. 我使用的是交叉编译器,而不是通常的 gcc。
  • @Tim,我注意到了,但是,如果它们没有正确声明,他会在头文件中得到错误,而不是在 C 文件中。
  • @paxdiablo,对不起,我没有抓到原型。
  • 在 gcc 和 clang 下对我来说也编译得很好,令人惊讶的是,未命名 pcb 并没有给出任何警告。 @lhw 在使用交叉编译器时这会给您带来任何错误吗?
【解决方案2】:

编译器似乎没有找到pcb 的定义。

【讨论】:

    【解决方案3】:

    变化:

    typedef struct{
        UINT32 proc;
        struct pcb *link;
    }pcb;
    

    到:

    typedef struct pcb {
        UINT32 proc;
        struct pcb *link;
    } pcb;
    

    【讨论】:

    • 为什么不会在标题中抛出错误呢?我认为他可能有一个损坏的编译器。
    【解决方案4】:

    首先,它是 '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
    

    另一种可能性

    VOID pcb_pq_enqueue(pcb_pQ* pcb_pQ, pcb* pcb) {

    pcb 来自哪里?有pcb* pcb是不好的。总是给变量类型和变量名取不同的名字

    【讨论】:

    • 是的,它实际上是在另一个定义文件中定义的,不过感谢您的回答
    • 一开始我也看到了同样的东西,但是,他在编译c文件时遇到了错误。如果VOID被破坏了,他一看到函数原型就会在header中得到错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    相关资源
    最近更新 更多