gpt4 book ai didi

c - 可以使用结构的大小来创建标识符吗?

转载 作者:太空狗 更新时间:2023-10-29 15:40:42 25 4
gpt4 key购买 nike

假设我有一个函数,我想根据类型的大小调用它。

有什么方法可以使用宏来完成吗?

static int array_find_index_4_impl(void *array, const unsigned int arr_len, const void *var)
{
const int32_t *arr_step = arr;
unsigned int i;
for (i = 0; i < arr_len; i++, arr_step++) {
if (*arr_step == *(int32_t *)var) {
return (int)i;
}
}
return -1;
}

static int array_find_index_2_impl(void *array, const unsigned int arr_len, const void *var)
{
const int16_t *arr_step = arr;
unsigned int i;
for (i = 0; i < arr_len; i++, arr_step++) {
if (*arr_step == *(int16_t *)var) {
return (int)i;
}
}
return -1;
}
/* etc... for other sizes too */

#define array_find_index(array, array_len, var) \
array_find_index_##SOME_MAGIC_SIZEOF(*array)##_impl(array, array_len, var)

可能的解决方案...

我知道 C11 的 _Generic 可用于检查特定类型,但我感兴趣的是忽略确切的类型并仅根据大小找到正确的函数。


另一种选择是存储函数查找表,例如:

#define array_find_index(array, var) \
array_find_index_fn_table[sizeof(*array)](array, var)

哪个可行,但如果可能,更愿意直接构造标识符。


当然可以将 sizeof 传递给函数并使用 memcmp,但我想知道是否可以从结构大小创建标识符

最佳答案

另一种可能的解决方案是生成一些 X-macro具有相关类型大小的头文件,即生成类似

的文件
#define MY_SIZEOF_int 4

等等......使用一些简单的C生成文件包含

#define WANT_SIZE(Typ)  {              \
printf("#define MY_SIZEOF_%s %d\n", \
#Typ, (int) sizeof(Typ)); };

在某个地方

WANT_SIZE(int)
WANT_SIZE(my_struct_t)

并在构建过程中运行专门的生成器...

假设之前有一些 typedef struct my_struct_st my_struct_t(因为这仅适用于简单命名的类型)。

当然,这需要使构建过程复杂化(例如,在您的 Makefile 中添加一些规则和目标...)

另一个解决方案可能是使用(使用 GCC ...)它的 __builtin_type_compatible_p甚至使用 MELT 自定义它(通过添加您的 特定编译指示或内置函数) .

关于c - 可以使用结构的大小来创建标识符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25397044/

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