2012-02-28 3 views
0

매크로의 도움으로 템플릿 목록을 만들었습니다. 코드에서 한 번 이상 사용하면 오류가 발생합니다. MS VS에 링크 오류 LNC2005가 있습니다. 함수의 본문이 머리글에 있기 때문에 발생합니다. 다른 방법으로 유지할 수 있습니까?ANSI C에서 템플릿 헤더를 연결하는 방법은 무엇입니까?

#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 

나는 list_i 및 list_pi 이름이있는 2 개의 목록을 얻지 못합니다. 두 번째 "list_pi"는 "선언되지 않은 식별자"입니다. 해결 방법이 있습니까? 두 번 감사드립니다.

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

이 파일을 여러 번 포함 할 때 링크 오류가 발생합니다 : 나는 당신의 질문 권리를 읽는다면

+0

그 헤더와 정확한 오류 메시지의 일부를 보지 않고도 정확하게 대답하는 것은 불가능할 것입니다. – Mat

답변

1

, 당신은이 같은 헤더를 가지고있다. 그러나 정적 함수를 만들 경우 : 당신은 링커 오류에 대해 걱정할 필요가 없습니다 있도록

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

방법은, 링커에 넣어되지 않을 것이다.

다른 옵션은 헤더에 메소드 선언을 넣고 프로젝트의 다른 곳에서 .c 파일에 구현을 배치하는 것입니다.

+0

고맙습니다. 이 대답이 도움이 되었다면 지금 성공 –

+0

@ so-olitary를 연결하십시오. 투표를하고 답변을 수락하십시오. 감사. –

관련 문제