gpt4 book ai didi

c - C 中的多重定义

转载 作者:行者123 更新时间:2023-11-30 17:26:44 26 4
gpt4 key购买 nike

只是想弄清楚为什么我会收到此错误?

/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:21: multiple definition of `insert_at_tail'
img.o:/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:21: first defined here
ImageList.o: In function `printList':
/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:43: multiple definition of `printList'
img.o:/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:43: first defined here
ImageList.o: In function `make_empty_list':
/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:57: multiple definition of `make_empty_list'

我用来设计这些函数的唯一文件是一个头文件和一个后续的实现 c 文件。

头文件包含以下声明:

void printList(ImageList *list);
ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element);
ImageList *make_empty_list(void);

虽然实现是这样的:

ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element){
node_t *new;
new = malloc(sizeof(*new));
assert(list!=NULL && new!=NULL);
new->data.dim = dimen;
new->data.num = element;
new->data.filename = malloc(strlen(name)*sizeof(char));
strcpy(new->data.filename, name);
new->data.QuadTree = qtree;
new->next = NULL;
if(list->tail==NULL){
list->head = list->tail = new;
} else {
list->tail->next = new;
list->tail = new;
}
return list;
}

// print a list (space-separated, on one line)

void printList(ImageList *list)
{
node_t *cur;

for (cur = list->head; cur != NULL; cur = cur->next) {
printf("%d",cur->data.num);
printf(" [%2d]",cur->data.dim);
printf(" %s",cur->data.filename);
}
putchar('\n');
}

// Make an empty list of images

ImageList *make_empty_list(void)
{
ImageList *list;
list = malloc(sizeof(*list));
assert(list!=NULL);
list->head = list->tail = NULL;
return list;
}

我知道造成这种情况的原因通常是在头文件中定义函数,但似乎我没有。我查看了实际使用这些函数的文件,但没有这些函数的额外定义。这两个文件的参数和返回值也相同,所以我有点迷失了。如有任何帮助,我们将不胜感激。

CFLAGS=-Wall -g

img : img.o QuadTree.o ImageList.o
gcc -o img img.o QuadTree.o ImageList.o

img.o : img.c QuadTree.h ImageList.h
gcc $(CFLAGS) -c img.c

QuadTree.o : QuadTree.c QuadTree.h
gcc $(CFLAGS) -c QuadTree.c

ImageList.o : ImageList.c ImageList.h
gcc $(CFLAGS) -c ImageList.c

clean :
rm -f img img.o QuadTree.o ImageList.o core

我添加了我的Makefile,问题是这样产生的吗?我对所有头文件也有保护,所以我仍然非常困惑,声明和定义有什么问题吗?

最佳答案

通过查看 zip 文件,我可以说一些事情

1) 从 ImageList.c 中删除quadtree.h,因为您已经包含在 ImageList.h 中

2) 使函数内联。在quadtree.c中的函数定义中。

我相信这会解决问题。

关于c - C 中的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26667484/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com