错误:函数

时间:2016-12-25 17:47:27

标签: c function

以下是insertItem()中的list.h声明,

void insertItem(List *, void *newItem);

以下是insertItem()中的tree.h声明,

void insertItem(Tree *, void *item);

下面是Tree抽象,即重用List抽象,说#include"list/list.h"

#ifndef TREE_H /* Header guard */
#define TREE_H

#include"list/list.h"

.....

void insertItem(Tree *, void *item);
....

#endif

编译时:

gcc -Wall -g -I. -DARRAY -DMULTI_WALK ./list/*.c ./tree/*.c testTree.c -o testTree

以下是错误:

./tree/tree.h:50:6: error: conflicting types for ‘insertItem’
 void insertItem(Tree *, void *item);
      ^
In file included from ./tree/tree.h:8:0,
                 from ./tree/multiWalkImpl.c:2:
./list/list.h:35:7: note: previous declaration of ‘insertItem’ was here
  void insertItem(List *, void *newItem);

问题的本质是什么?因为insertItem()中的tree.h& list.h具有不同的参数类型。

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

由于C没有函数重载,因此通常会通过添加描述不同参数的前缀来解决此类冲突。

e.g。 List_insertItemTree_insertItem

请注意,在实际代码中,应在出现任何此类冲突之前添加此类命名空间前缀,因为无法事先知道用户代码正在使用哪些函数名称。这样可以避免在以后更改名称时破坏现有代码的麻烦。

答案 1 :(得分:2)

在您的情况下,您可以使用_Generic运算符。

首先,您需要更改容器功能的名称。最好是:list_insertItem,tree_insertItem等。

然后使用generic:

#define insertItem( object , item )    _Generic( object ,                 \
                                                 Tree*: tree_insertItem , \
                                                 List*: list_insertItem )( object , item )

这个宏定义必须看到两种类型的定义和两种函数,所以你可以将它放入一个包含容器头的公共头,在代码中包含那个头,并使用通用宏函数。