Clang为什么会看到类型冲突?

时间:2014-05-30 01:09:05

标签: c linux compiler-errors clang header-files

解决!

也许我正在失去优势,但对我来说,当我编译链表文件(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;
}

2 个答案:

答案 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