我在头文件中遇到一些struct typedef声明时遇到了一些问题,而这些声明看起来并不是我的实现文件。
具体来说,我定义了以下类型:Type,Value,Integer,String和Float。它们都是从结构名称中以类型完全相同的方式定义的。我正在编写一个非正式的hashCode
函数来补充我正在设计的哈希表,它引用了所有这些数据类型。类型和值工作正常,但Integer / Float / String无法正常工作,我无法弄清楚原因。
我道歉,这个问题有点牵扯,但我会尽量不提供太多或太少的信息,也许对于这里的专家来说这不会太难。 : - )
我将从hashCode函数开始(请不要让我知道它有多糟糕,我知道它并不是那么好而且我真的不在乎):
int hashCode(ST_HashSymbol *hash, Value *v) { Type *t = v->type; switch (whichType(t->name)) { case INTEGER: Integer *i = (Integer *)v->innerValue; return i->value % hash->capacity; case FLOAT: { Float *f = (Float *)v->innerValue; float val = f->value; long l = 0l; if (val 2 && j = 0; --j) { if (val >= pow(2, j - 22)) { val -= pow(2, j - 22); l |= 1 capacity; } case STRING: String *s = (String *)v->innerValue; char *str = s->value; int total = 0; char *c; for (c = str; *c != '\0'; ++c) { total += *c; } return total % hash->capacity; default: return -1; } }
摘自“type.h”头文件,该文件定义了所有类型。值得注意的是,我也尝试将typedef和struct定义合并为一个语句,但这也不起作用:
typedef struct _t Type; typedef struct _v Value; struct _t { char *name; struct _t *widerType; }; struct _v { Type *type; void *innerValue; }; Type *type(int); int whichType(char *); Type *getType(char *); /**************************/ /* Actual ("inner") types */ /**************************/ typedef struct _str String; typedef struct _int Integer; typedef struct _fl Float; struct _str { int length; char *value; }; struct _int { int value; }; struct _fl { float value; };
当我运行make时,我得到以下内容:
[kparting@dhcp-10-25-247-130 eq]$ make gcc -o eq -Wall -g parser.c eq.c error.c hash.c symbols.c type.c -lm hash.c: In function ‘hashCode’: hash.c:33: error: expected expression before ‘Integer’ hash.c:34: error: ‘i’ undeclared (first use in this function) hash.c:34: error: (Each undeclared identifier is reported only once hash.c:34: error: for each function it appears in.) hash.c:37: error: expected expression before ‘Float’ hash.c:38: error: ‘f’ undeclared (first use in this function) hash.c:69: error: expected expression before ‘String’ hash.c:70: error: ‘s’ undeclared (first use in this function) make: *** [eq] Error 1
正如我所提到的,Type *和Value *是有效的数据类型,但其他三种都不是。 whichType
和type
函数不使用其他三种数据类型。
提前感谢您的帮助。我很确定这必须与头文件中结构的位置有关,或者可能(但非常不可能)gcc本身。
答案 0 :(得分:4)
您无法在案例块中声明变量。
实际上并非完全为真。 See here.应该帮助你清理。
答案 1 :(得分:2)
在C中,您只能在块的开头声明变量。你的行:
Integer *i = (Integer *)v->innerValue;
尝试声明变量i,但在块的开头是而不是。你可以通过打开一个块来解决这个问题:
case INTEGER:
{
Integer *i = (Integer *)v->innerValue;
return i->value % hash->capacity;
}
...和其他case
的类似。