以下是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
具有不同的参数类型。
如何解决此问题?
答案 0 :(得分:3)
由于C没有函数重载,因此通常会通过添加描述不同参数的前缀来解决此类冲突。
e.g。 List_insertItem
和Tree_insertItem
。
请注意,在实际代码中,应在出现任何此类冲突之前添加此类命名空间前缀,因为无法事先知道用户代码正在使用哪些函数名称。这样可以避免在以后更改名称时破坏现有代码的麻烦。
答案 1 :(得分:2)
在您的情况下,您可以使用_Generic运算符。
首先,您需要更改容器功能的名称。最好是:list_insertItem,tree_insertItem等。
然后使用generic:
#define insertItem( object , item ) _Generic( object , \
Tree*: tree_insertItem , \
List*: list_insertItem )( object , item )
这个宏定义必须看到两种类型的定义和两种函数,所以你可以将它放入一个包含容器头的公共头,在代码中包含那个头,并使用通用宏函数。