错误的冲突类型

时间:2012-11-11 10:41:31

标签: c types

我正在使用数组实现的优先级队列。一切似乎工作正常,但我得到这个错误:'删除'的冲突类型 我已经在其头文件中声明了该函数,我已经包含了头文件,但编译器stil抱怨。我认为这个问题存在于其他地方。

这是pqueue.h:

    #ifndef PQUEUE_H
    #define PQUEUE_H
    //---------------

    #define HIGHP  0
    #define MEDP   1
    #define LOWP   2
    #define MAXEL 10

    #include <stddef.h>

    typedef struct message {
        char data[100];
        int priority;
    } message;

    typedef struct pQueue {
        struct message messages[10];
        int rear;
        int front;
        int size;
    } pQueue;

    void initPQueue(pQueue *pq);
    void add(pQueue *pq, char *data, int pri);
    char* remove(struct pQueue *pq);    // Error: conflicting types for: 'remove'
    int isEmpty(pQueue *pq);

    #endif

pqueue.c:

    #include "pqueue.h"
    #include <string.h>

    void initPQueue(pQueue *pq) {
        pq->front = 0;
        pq->rear = 0;
        pq->size = 0;
    }

    void add(pQueue *pq, char *data, int pri) {
        if (pq->size > MAXEL) {
            return; // NOTE: data is lost
        }
        message m;
        strcpy(m.data, data);
        m.priority = pri;

        if (isEmpty(pq)) {
            pq->messages[pq->rear] = m;
            pq->rear = (pq->rear % (MAXEL - 1)) + 1;
            return; // done
        }

        /**TODO: NEEDS REPAIR**/
        int i = 0;
        int j = 0;
        for (; i < pq->rear; i = (i % (MAXEL - 1)) + 1) {
            if (m.priority > pq->messages[i].priority) {
                // found element with higher or equal priority
                for (j = pq->rear - 1; j >= i; j = (j % (MAXEL - 1)) - 1) {
                    pq->messages[j] = pq->messages[j - 1];
                }
                    break;
            }
        }
        pq->messages[i] = m;
        /****/

        pq->size++;
    }

    char* remove(struct pQueue *pq) {
        if (isEmpty(pq)) {
            return NULL ;
        }
        pq->size--;
        return pq->messages[pq->front].data;
    }

    int isEmpty(pQueue *pq) {
        if (!pq->size) 
            return 1;

        return 0;
    }

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

int remove(const char *path)是标准函数。您需要为自己选择一个不同的名称。

答案 1 :(得分:2)

为了回应其他人所说的,有一个标准功能。但要添加到此,在C中,您应该始终在函数前面加上库的名称及其操作的类型,以避免出现这些问题。例如,最好将您的函数命名为:

mylibrary_pqueue_remove

这样可以避免命名标准库和其他人的代码冲突。

答案 2 :(得分:1)

remove是保留的标识符,只要您添加<stdio.h>,就无法在程序中使用它。

  

7.21.4.1 remove功能

     

#include <stdio.h>
   int remove(const char *filename);

     

remove函数会导致名称为指向的字符串的文件   该名称不再可以访问该文件名。随后的尝试   使用该名称打开该文件将失败,除非它已创建   重新。如果文件是打开的,则删除功能的行为是   实现定义的。