C 中的多个定义

  • 本文关键字:定义 c definitions
  • 更新时间 :
  • 英文 :


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

/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

我添加了我的制作文件,是问题出现吗?我对所有头文件也有保护,所以我仍然非常困惑,声明和定义有什么问题吗?

通过查看zip文件,我可以说几件事

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

2( 使函数内联。在函数定义的四叉树中。

我相信这将解决问题。

扩展注释:在包含中使用保护措施,如果多次包含文件,则不会定义两次相同的内容:

#ifndef HEADER_IMG_H
#define HEADER_IMG_H
void printList(ImageList *list);
ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element);
ImageList *make_empty_list(void);
#endif

这种模式是 #ifndef HEADER_FILE_H #define HEADER_FILE_H...这里声明... #endif。

相关内容

  • 没有找到相关文章

最新更新