我有一些代码根据底层数据类型执行不同的操作。 EG:
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似乎已接近尾声,但经过进一步检查,这些类型都是用于转换或确定整数的系统特定最小/最大值的宏。
答案 0 :(得分:4)
没有这样的标准常数,没有。 C中有很多东西你认为会标准化,但不是。
作为旁注,您可以通过使用C11 _Generic
关键字并实现多态行为而不是使用此类枚举的运行时检查,迈出更多现代C编程的第一步。事实上,你可以完全摆脱枚举:
// variant.h / variant.c
#include <stdio.h>
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;
}
答案 1 :(得分:0)