如何在ANSI C中链接模板头?

时间:2012-02-28 12:48:34

标签: c templates

我在宏的帮助下制作了一个模板列表。当我在代码中使用它超过一次时,我有一个错误。 MS VS中存在链接错误LNC2005。 我认为,它发生了,因为函数体在标题中,还有另一种方法可以保留它们吗?

#define  GENERIC_LIST_POSTFIX  i
#define  GENERIC_LIST_TYPE     int
#define  GENERIC_LIST_NAME     list

#include "generic_list.h"

#undef  GENERIC_LIST_POSTFIX
#undef  GENERIC_LIST_TYPE   
#undef  GENERIC_LIST_NAME  

如果我不能改变语言,你能给我什么建议? 感谢。

有我的代码

#ifndef _GENERIC_LIST_H
#define _GENERIC_LIST_H

#define _CAT(x,y)    x##y
#define  CAT(x,y)  _CAT(x,y)

#if !defined GENERIC_LIST_POSTFIX 
#   error("GENERIC_LIST_POSTFIX")
#endif

#if !defined GENERIC_LIST_TYPE
#   error("GENERIC_LIST_TYPE")
#endif
#if !defined GENERIC_LIST_NAME 
#   error("GENERIC_LIST_NAME")
#endif
//-------------------------------------------------------------------------------
typedef struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node) CAT(GENERIC_LIST_NAME,_node);
struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node)
{ GENERIC_LIST_TYPE value;
  struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node) *prev;
  struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node) *next;
};

//typedef struct CAT(_list_,GENERIC_LIST_POSTFIX) GENERIC_LIST_NAME;
struct CAT(_list_,GENERIC_LIST_POSTFIX)
{ unsigned int len; // number of elements
  struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node) *first;
  struct CAT(CAT(_list_,GENERIC_LIST_POSTFIX),_node) *last;
};
//-------------------------------------------------------------------------------
void   CAT(CAT(list_,GENERIC_LIST_POSTFIX),_create )
(struct CAT(_list_,GENERIC_LIST_POSTFIX) *List);
{ List->len   = 0; List->first = NULL; List->last  = NULL; }

void   CAT(CAT(list_,GENERIC_LIST_POSTFIX),_copy   )
(struct CAT(_list_,GENERIC_LIST_POSTFIX) *scr, struct CAT(_list_,GENERIC_LIST_POSTFIX) *dest);
{ // ... }
// ... there are more code
#endif

一切正常,但还有另一个问题。 我只能在一个.c文件中使用这个.h文件一次。 例如,如果我首先将GENERIC_LIST_TYPE定义为int,而不是int *。

#define  GENERIC_LIST_POSTFIX  i
#define  GENERIC_LIST_TYPE     int
#define  GENERIC_LIST_NAME     list_i

#include "generic_list.h"

#undef   GENERIC_LIST_POSTFIX
#undef   GENERIC_LIST_TYPE   
#undef   GENERIC_LIST_NAME  


#define  GENERIC_LIST_POSTFIX  pi
#define  GENERIC_LIST_TYPE     int*
#define  GENERIC_LIST_NAME     list_pi

#include "generic_list.h"

#undef   GENERIC_LIST_POSTFIX
#undef   GENERIC_LIST_TYPE   
#undef   GENERIC_LIST_NAME 

我没有获得带有list_i和list_pi名称的2个列表。 第二个“list_pi”是“未声明的标识符”。 这有解决方案吗? 谢谢你两次。

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读了你的问题,你就会有这样的标题:

void doSomething()
{
    printf("doing something");
}

多次包含文件时会导致链接错误。 但是,如果您将函数设为静态:

static void doSomething()
{
    printf("doing something");
}

该方法不会被放到链接器中,因此您不必担心链接器错误。

您的另一个选择是在标题中放置方法声明,并在项目的其他位置放置.c文件中的实现。