是否有标准的C头文件为所有基本类型分配数值?

我有一些代码根据底层数据类型执行不同的操作。 例如:

void *some_data = obtain_data(); int data_type = obtain_data_type(); switch(data_type) { case CHAR: handle_char(some_data); break; case SHORT: handle_short(some_data); break; case INT: handle_int(some_data); break; // etc... } 

为了使其工作,我需要一个枚举或常量,为CHAR,SHORT,INT等分配一个数值.EG:

 enum POD_TYPES { CHAR = 1, SHORT = 2, INT = 3 // etc. } 

“滚动我自己”在这里是微不足道的,但似乎应该有一种更成熟的方式来实现这一目标。 是否有一个标准(或至少是常用的)头文件,我可以包含已经在某处定义了这些值? 我没有在cppreference的库头中看到任何内容。 inttypes.h似乎接近了,但经过进一步检查,这些类型都是用于转换或确定整数的系统特定最小/最大值的宏。

没有这样的标准常数,没有。 C中有很多东西你认为会标准化,但事实并非如此。


作为旁注,您可以通过使用C11 _Generic关键字并实现多态行为而不是使用此类枚举的运行时检查来迈出更现代的C编程的第一步。 事实上,你可以完全摆脱枚举:

 // variant.h / variant.c #include  typedef void print_func_t (const void* data); typedef struct { void* data; print_func_t* print; } variant_t; void print_char (const void* data) { printf("%c", *(const char*) data); } void print_short (const void* data) { printf("%hd", *(const short*) data); } void print_int (const void* data) { printf("%d", *(const int*) data); } void print (const variant_t* var) { var->print(var->data); } #define variant_init(var) { \ .data = &var, \ .print = _Generic((var), char: print_char, short: print_short, int: print_int) \ } 

呼叫者:

 int main() { char c = 'A'; short s = 3; int i = 5; variant_t var[3] = { variant_init(c), variant_init(s), variant_init(i) }; for(size_t i=0; i<3; i++) { print(&var[i]); printf(" "); } return 0; } 

这在C ++中称为变体类型。 有很多库可以帮到您,例如:

  1. 来自Qt的QVariant
  2. 提升任何

但请记住,使用这样的库时需要付出代价。 当您使用变体时,事情并不是最有效的,但有时候它是必要的,例如当您使用OPC / UA协议时。