可以使用结构的大小来创建标识符吗?
发布时间: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 …)其 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |