【发布时间】:2017-03-06 09:37:26
【问题描述】:
我有一些常量值和数组来定义它们的标签和哈希码。例如,
#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 个。
【问题讨论】:
-
索引到数组实际上是取消引用一个指针。我相信这不能由编译器静态完成,因此会出现错误。
-
case 67490: //line giving compile time error..err..真的吗? -
#define LABEL_A_HASH 67490怎么样? -
选择 C 或 C++。
const int LABEL_A的代码不会在 C 中编译,但可以在更高版本的 C++ 中编译。因此,对此给出“C/C++”答案没有意义,请从问题中删除任何一种语言。 -
您是否考虑过创建一个指向函数的指针数组并在没有 if-else 语句或 switch-cases 的情况下简单地调用所需的函数?
标签: c arrays switch-statement