我来自C ++背景,最近开始学习C。我在为类型分配数字时遇到麻烦(反之亦然);我需要的是一种为类型分配唯一ID的方法,最好从0
开始。我的目标是要有一个函数(或宏)根据传入的类型对数组进行索引,我相信只能通过宏才能实现。
此外,由于我使用了需要传递的sizeof()
类型,因此很难使用enums
作为替代。如果我将枚举数传递给函数/宏,则必须从数字中获取类型,而这个数字恰好相反(但可能更容易)。
这在C语言中甚至可能吗?我曾尝试研究此问题,但没有特别找到该问题的任何答案,而我可以使用C ++使用模板来做到这一点,例如:
int curTypeIdx = 0;
template <typename T>
struct TypeHandle {
static int const val;
}
template <typename T>
int const TypeHandle<T>::val = curTypeIdx++;
这样做的原因是我正在构建ECS。我有一个EntityManager
结构,该结构应该包含组件数组。由于我计划将其用作通用对象,因此我定义了组件(MAX_COMPONENTS
)的上限,并具有长度为char*
的{{1}}个数组。从根本上讲,目标是使MAX_COMPONENTS
的用户能够定义自己的组件,并将其存储在这些通用数组中。
如果还有其他方法可以
谢谢大家的建议。
答案 0 :(得分:4)
如果可以一次枚举所有受支持的类型(如果语言包含新类型,则更新列表),则可以使用C宏的字符串化功能和字符串数组来实现所需的功能。
#define GET_TYPE_ID(type) get_type_id(#type)
const char *type_strings[] = { "char", "unsigned char", "short" /* so on.. */};
int get_type_id(const char* type_string) {
for( int i = 0; i < sizeof(type_strings)/sizeof(const char*); i++) {
if ( strcmp(type_string, type_strings[i]) == 0 ) return i;
}
// Should never reach here if you have taken care of all types and
// don't pass in illegal types.
}
现在,您可以使用GET_TYPE_ID(int)
,GET_TYPE_ID(char)
等为每种类型获取一个整数ID。