2012-02-28 35 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 

所有的作品,但還有另一個問題。 我只能在一個.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 

我沒有得到2列表與list_i和list_pi名稱。 第二個「list_pi」是「未聲明的標識符」。 有沒有解決方案? 謝謝兩次。

+0

如果沒有看到至少部分的頭部和確切的錯誤信息,那麼這將是不可能正確回答的。 – Mat 2012-02-28 12:50:59

回答

1

如果我看了你的問題的權利,你有這樣的標題:

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

當你包括文件多次導致鏈接錯誤。 但是,如果你做的函數靜:

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

的方法將不會被投入到連接器,這樣你就不會擔心鏈接錯誤。

您的其他選擇是將方法聲明放在您的頭文件中,並將實現放在項目中其他位置的.c文件中。

+0

謝謝。現在鏈接成功 – 2012-02-28 13:13:11

+0

@ so-olitary如果這個答案幫助你,請投票並接受答案。謝謝。 – 2012-02-28 13:17:56