【问题标题】:Is there a way to assign a unique number to a type in C?有没有办法为 C 中的类型分配唯一编号?
【发布时间】:2019-01-24 23:03:28
【问题描述】:

我来自 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) 并有一个长度为 MAX_COMPONENTSchar*s 数组。在基本层面上,目标是让EntityManager 的用户能够定义自己的组件,并将它们存储在这些通用数组中。

如果有其他办法

谢谢大家的建议。

【问题讨论】:

  • 为什么不使用enum
  • 宏还使用该类型的 sizeof 进行转换,所以如果我使用枚举,我将不得不做相反的事情:从数字索引中获取类型。我将编辑原始帖子以澄清。
  • “为类型分配数字”是什么意思?你能举一个例子来说明你如何在 C++ 中做到这一点吗?
  • 您可以在同一个文件中定义您的类型,并使用__LINE__(当前行号)作为唯一ID。你能告诉我们你想用 C 实现什么吗?
  • 这听起来像是XY problem。您正在尝试解决问题 X 并在您的脑海中找到不完整的解决方案 Y。当您的问题可能有另一个解决方案 Z 更适合 C 语言中可用的工具时,您现在正在询问有关 Y 的问题。请提供有关您尝试解决的原始问题 X 的更多信息。

标签: c types


【解决方案1】:

如果您可以一次枚举所有支持的类型(如果语言出现新类型,则更新列表),那么您可以使用 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。

【讨论】:

  • 谢谢!我不知道宏的# 功能。我可以用它来制作某种“寄存器类型”宏。
猜你喜欢
  • 2014-12-04
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
相关资源
最近更新 更多