解决!
也许我正在失去优势,但对我来说,当我编译链表文件(llist)时,我不明白为什么Clang会给我以下错误。
error: conflicting types for 'remove'
int remove(struct node *llist, int val);
note: previous declaration is here
extern int remove(const char *__filename) __THROW;
我的.h文件:
struct node{
int val;
struct node *left, *right;
};
struct node* get(struct node *llist, int i);
int remove(struct node *llist, int val);
struct node* search(int val, struct node *llist);
void deleteList(struct node *llist);
void add(struct node *llist, struct node *toAdd);
我的.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "llist.h"
int remove(struct node *llist, int val){
struct node *cur = llist->right;
while(cur != llist){
if(cur->val != val)
cur = cur->right;
else{
cur->left->right = cur->right;
cur->right->left = cur->left;
free(cur);
return 1;
}
}
return 0;
}
答案 0 :(得分:5)
remove
中有一个名为stdio.h
的标准函数,其签名为:
int remove(const char *filename);
重命名您的功能。
注意:正如@R ..指出的那样,即使未包含remove
,也会保留名称stdio.h
。
答案 1 :(得分:1)
让我们尝试编译这个简化的测试用例:
#include <stdio.h>
struct node;
int remove(struct node *llist, int val);
如果我们编译它,我们会收到以下通知:
foo.c:3:5: error: conflicting types for 'remove'
int remove(struct node *llist, int val);
^
/usr/include/stdio.h:261:6: note: previous declaration is here
int remove(const char *);
^
1 error generated.
这清楚地告诉我们stdio.h
已经定义了remove()
函数,您需要重命名函数。
如果您对remove()
所做的事情感兴趣,可以了解here。