У меня есть некоторые постоянные значения и массивы, определяющие их метки и их хэш-коды. Например,
#define LABEL_A 0 //or const int LABEL_A = 0;
#define LABEL_B 1
#define LABEL_C 2
#define LABEL_D 3
const char *VALUE[] = {"LABEL_A", "LABEL_B", "LABEL_C", "LABEL_D"};
const int VALUE_HASH[] = {67490, 67491, 67493, 67459);
Во время выполнения эти метки могут поступать в любом порядке и должны быть соответствующим образом проанализированы. Для этой цели я использую переключатель. Этот код генерирует ошибку во время компиляции "требуется постоянное выражение.
function(const char* LabelAtRuntime){
int i = getHashCode(LabelAtRuntime);
switch(i){
case VALUE_HASH[LABEL_A]: //line giving compile time error
break;
default:
break;
}
Но, когда я предоставляю фактические константы, он работает. Этот код работает хорошо.
function(const char* LabelAtRuntime){
int i = getHashCode(LabelAtRuntime);
switch(i){
case 67490: //line not giving compile time error
break;
default:
break;
}
- Я не могу понять, почему это происходит? Как мой массив, так и его индекс являются константами, то не эквивалентны ли они постоянному литералу?
- Есть ли другой способ, с помощью которого я могу предоставить свои константы требуемым образом?
Я использую константы таким образом, чтобы обеспечить лучшую семантику кода, читаемость и повторное использование. Не предлагайте решение на основе if-else
. В приведенном выше примере есть только 4 метки, но на практике их может быть 100.