gpt4 book ai didi

c - 从结构数组中提取特定结构数据成员数组的通用函数

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:50 26 4
gpt4 key购买 nike

如果我有一个结构,比如

struct mystuff {
int a;
int b;
int c;
}

然后我有这些结构的数组,

struct mystuff array[] = {...};

现在假设我想将结构数据成员 a 提取到它自己的数组中,

int* get_mystuff_a(struct mystuff *array, int n)
{
int i;
int *a_array;

a_array = malloc(n*sizeof(int));

for(i=0;i<n;i++) {
a_array[i] = array[i].a;
}
return a;
}

现在如果我想对 b 做同样的事情,我必须编写另一个函数,但它几乎完全相同,除了

b_array[i] = array[i].b;

有没有一种方法可以编写一个通用函数并指定要提取的数据成员作为参数?

我认为宏函数可能有效,但我不知道您实际如何编写它

如果您还可以指定数据类型,例如数据成员的 int、float、double 等 - 使其更加通用

最佳答案

把它写成一个宏很容易,但这并不是一个好主意。

在这种情况下,我认为最好编写一个构建函数的宏,而不是尝试直接内联完成工作:

  1. 获取您的非通用代码。
  2. 在每一行的末尾添加\,因为宏只有一行。
  3. 在开头添加#define NAME(...)\
  4. 在需要的地方替换宏参数。
  5. 如果需要,不要忘记额外的括号。

结果将是这样的:

#define GET_MYSTUFF(TYPE, FIELD) \
TYPE* get_mystuff_##FIELD(struct mystuff *array, int n) \
{ \
int i; \
TYPE *res_array; \
res_array = malloc(n*sizeof(TYPE)); \
for(i=0;i<n;i++) { \
res_array[i] = array[i].FIELD; \
} \
return res_array; \
}

现在您可以使用以下方法创建所有函数:

GET_MYSTUFF(int, a)
GET_MYSTUFF(int, b)
GET_MYSTUFF(int, c)

您甚至可以将输入数组类型添加为宏的另一个参数,但这留给读者作为练习。

更新:请注意,此宏扩展为函数定义,您不应在头文件中定义函数,否则会出现重复定义错误。有几种解决方案,选择你最好的:

  1. 将您的函数设为静态(static TYPE*​​ get_mystuff_##FIELD(...)。这样,包含您的函数的每个编译单元都将获得该函数的副本。
  2. 将函数的定义移动到mystuff.c 文件中,并且只在mystuff.h 中写入函数原型(prototype)。您可以手动编写这些原型(prototype)或为此创建一个宏:

    #define GET_MYSTUFF_PROTO(TYPE, FIELD) TYPE*​​ get_mystuff_##FIELD(struct mystuff *array, int n);

  3. 需要一些额外的工作,如果您想找点乐子,可以使用 X_Macros !

我的资料.h

#ifndef GET_MYSTUFF
#define GET_MYSTUFF(TYPE, FIELD) \
TYPE* get_mystuff_##FIELD(struct mystuff *array, int n);
#endif

GET_MYSTUFF(int, a)
GET_MYSTUFF(int, b)
GET_MYSTUFF(int, c)

我的资料.c

/* include for prototypes */
#include "mystuff.h"

#undef GET_MYSTUFF
#define GET_MYSTUFF(TYPE, FIELD) \
TYPE* get_mystuff_##FIELD(struct mystuff *array, int n) \
{ \
int i; \
TYPE *res_array; \
res_array = malloc(n*sizeof(TYPE)); \
for(i=0;i<n;i++) { \
res_array[i] = array[i].FIELD; \
} \
return res_array; \
}

/* include for definitions */
#include "mystuff.h"

关于c - 从结构数组中提取特定结构数据成员数组的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140374/

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