gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:58:48 24 4
gpt4 key购买 nike

我在宏的帮助下制作了一个模板列表。当我在代码中多次使用它时,我遇到了一个错误。 MS VS 中出现链接错误 LNC2005。我认为,这种情况发生了,因为函数体位于 header 中,是否有另一种方法来保留它们?

#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”是“未声明的标识符”。有解决办法吗?谢谢你两次。

最佳答案

如果我没看错你的问题,你的标题是这样的:

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

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

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

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

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

关于c - 如何在 ANSI C 中链接模板头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com