gpt4 book ai didi

c - 使用宏定义结构和函数,如何停止多个定义

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:46 27 4
gpt4 key购买 nike

我正在尝试使用宏定义一个动态数组结构以及一些伴随它的函数

//dynArray.h
#define CUTILS_DEF_DYNARRAY(TYPE, NAME)\
typedef struct NAME{\
TYPE *data;
size_t size, capacity;
} NAME;\
//define functions here, e.g.
int NAME##Init(NAME *arr, size_t size){\
//code here
}\

当我在 header 中定义动态数组时,我的问题发生了,在本例中使用它来定义字符串结构的数组

//str.h
#include "dynArray.h"
//define struct here
CUTILS_DEF_DYNARRAY(cutilsString, cutilsStringArr);

字符串 header 包含在 file.h 中,这会导致冲突,因为编译器告诉我字符串数组函数有多个函数定义。这是我遇到的错误之一的示例

/usr/bin/ld: out/file.o: in function `cutilsByteStreamArrInit':
file.c:(.text+0x290): multiple definition of `cutilsByteStreamArrInit'; out/bytestream.o:bytestream.c:(.text+0x0): first defined here

我所有的 header 都有适当的包含保护,定义字符串函数的宏在字符串 header 中只使用一次。我做错了什么,我该如何解决?

最佳答案

将实现拆分为.h 文件和.c 文件。

// dynArray.h
#define CUTILS_DEF_DYNARRAY_H(TYPE, NAME) \
typedef struct NAME{ \
TYPE *data; \
size_t size, capacity; \
} NAME; \
/* declare (don't define) functions */ \
int NAME##Init(NAME *arr, size_t size);

#define CUTILS_DEF_DYNARRAY_C(TYPE, NAME) \
int NAME##Init(NAME *arr, size_t size) { \
/* something happens here */; \
return 0; \
}

然后像这样使用它:

// str.h
#include "dynArray.h"
CUTILS_DEF_DYNARRAY_H(cutilsString, cutilsStringArr)

// str.c
#include "str.h"
#include "dynArray.h"
CUTILS_DEF_DYNARRAY_C(cutilsString, cutilsStringArr)

并将str.c文件添加到您的编译过程中。

注意事项:

  • 或者,您可以将所有从宏导出的符号/变量/函数设为静态
  • 宏调用后没有;

What am I doing wrong

您要在多个交易单元中声明一个带有外部链接的符号。 IE。您有两个 .c 文件,它们定义相同的函数 cutilsByteStreamArrInit,但不是 static。而且这两个功能是连在一起的。您只能有一个外部可见符号的定义。包含多个定义错误的链接器错误。

how can I fix it?

要么创建一个包含所有导出符号定义的单独的 .c 文件(我建议这样做),要么将宏中的所有符号标记为 static

关于c - 使用宏定义结构和函数,如何停止多个定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452731/

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