как связать заголовок шаблона в ANSI C? - PullRequest
0 голосов
/ 28 февраля 2012

Я сделал список шаблонов с помощью макросов.И у меня есть ошибка, когда я использую его более одного раза в коде.В 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

Все работает, но есть другая проблема.Я могу использовать этот .h файл только один раз в одном .c файле.Если я определю 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 

Я не получаю 2 списка с именами list_i и list_pi.Второй «list_pi» - это «необъявленный идентификатор».Есть ли решение для этого?Спасибо дважды.

1 Ответ

1 голос
/ 28 февраля 2012

Если я правильно прочитал ваш вопрос, у вас есть такой заголовок:

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

, который приводит к ошибкам ссылки, когда вы включаете файл несколько раз.Однако, если вы сделаете функцию статической:

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

Метод не будет применен к компоновщику, поэтому вам не придется беспокоиться об ошибках компоновщика.

Другой вариант -поместить объявление метода в ваш заголовок и реализацию в файле .c в другом месте вашего проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...