加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:09:32 所属栏目:百科 来源:网络整理
导读:假设我有一个我想根据类型的大小调用的函数. 有没有办法可以使用宏来完成? 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++,ar
假设我有一个我想根据类型的大小调用的函数.

有没有办法可以使用宏来完成?

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 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,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 %dn",
          #Typ,(int) sizeof(Typ)); };

并在某处

WANT_SIZE(int)
WANT_SIZE(my_struct_t)

并在构建过程中运行专用生成器…

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

当然,这需要复杂化构建过程(例如,在Makefile中添加几个规则和目标……)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读