我正在使用数组实现的优先级队列。一切似乎工作正常,但我得到这个错误:'删除'的冲突类型 我已经在其头文件中声明了该函数,我已经包含了头文件,但编译器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;
}
有什么想法吗?
答案 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
函数会导致名称为指向的字符串的文件 该名称不再可以访问该文件名。随后的尝试 使用该名称打开该文件将失败,除非它已创建 重新。如果文件是打开的,则删除功能的行为是 实现定义的。