C 结构的typedef似乎没有在头文件中通过?

C 结构的typedef似乎没有在头文件中通过?,c,gcc,typedef,struct,C,Gcc,Typedef,Struct,头文件中的一些struct-typedef声明似乎没有进入我的实现文件,这让我遇到了一些问题 具体来说,我定义了以下类型:类型、值、整数、字符串和浮点。它们都是以完全相同的方式从结构名称中定义的类型。我正在编写一个非正式的hashCode函数来补充我正在设计的引用所有这些数据类型的哈希表。类型和值可以正常工作,但Integer/Float/String不能正常工作,我不知道为什么 很抱歉,这个问题有点复杂,但我会尽量不提供太多或太少的信息,也许这对这里的专家来说不会太困难。:-) 我将从hash

头文件中的一些struct-typedef声明似乎没有进入我的实现文件,这让我遇到了一些问题

具体来说,我定义了以下类型:类型、值、整数、字符串和浮点。它们都是以完全相同的方式从结构名称中定义的类型。我正在编写一个非正式的
hashCode
函数来补充我正在设计的引用所有这些数据类型的哈希表。类型和值可以正常工作,但Integer/Float/String不能正常工作,我不知道为什么

很抱歉,这个问题有点复杂,但我会尽量不提供太多或太少的信息,也许这对这里的专家来说不会太困难。:-)

我将从hashCode函数开始(请不要批评它有多糟糕,我知道它不太好,我真的不在乎):

int hashCode(ST_HashSymbol*hash,值*v) { 类型*t=v->Type; 开关(类型(t->名称)) { 大小写整数: 整数*i=(整数*)v->innerValue; 返回i->值%hash->容量; 案例浮动: { Float*f=(Float*)v->innerValue; float val=f->value; 长l=0l; 如果(val 2&&j=0;--j) { 如果(val>=pow(2,j-22)) { val-=pow(2,j-22); l |=1个容量; } 大小写字符串: 字符串*s=(字符串*)v->innerValue; char*str=s->value; int-total=0; char*c; 对于(c=str;*c!='\0';++c) { 总数+=*c; } 返回总%hash->capacity; 违约: 返回-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; }; 类型定义结构类型; 类型定义结构值; 结构{ 字符*名称; 结构_t*widerType; }; 结构{ 类型*类型; void*内部值; }; 类型*类型(int); 整型(字符*); 类型*getType(char*); /**************************/ /*实际(“内部”)类型*/ /**************************/ typedef结构_str字符串; typedef struct_int Integer; 类型定义结构_flfloat; 结构{ 整数长度; 字符*值; }; 结构_int{ int值; }; 结构层{ 浮动值; }; 当我运行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 [kparting@dhcp-10-25-247-130均衡器]$make gcc-o eq-Wall-g parser.c eq.c error.c hash.c symbols.c type.c-lm hash.c:在函数“hashCode”中: hash.c:33:错误:“Integer”之前应为表达式 hash.c:34:错误:“i”未声明(此函数首次使用) hash.c:34:error:(每个未声明的标识符只报告一次 hash.c:34:错误:对于它出现在中的每个函数。) hash.c:37:错误:“Float”之前应为表达式 hash.c:38:错误:“f”未声明(此函数首次使用) hash.c:69:错误:“String”之前应为表达式 hash.c:70:错误:“s”未声明(此函数首次使用) make:**[eq]错误1 如前所述,Type*和Value*是有效的数据类型,但其他三种不是。
whichType
Type
函数不使用其他三种数据类型中的任何一种


提前感谢您的帮助。我确信这与头文件中结构的位置有关,也可能与gcc本身有关(但可能性很小)。

在C中,您只能在块的开头声明变量。您的行:

Integer *i = (Integer *)v->innerValue;
尝试声明变量i,但它不在块的开头。只需打开块即可修复此问题:

case INTEGER:
{
    Integer *i = (Integer *)v->innerValue;
    return i->value % hash->capacity;
}

…与另一个
情况类似。

在C中,只能在块的开头声明变量。行:

Integer *i = (Integer *)v->innerValue;
尝试声明变量i,但它不在块的开头。只需打开块即可修复此问题:

case INTEGER:
{
    Integer *i = (Integer *)v->innerValue;
    return i->value % hash->capacity;
}

…对于另一个
案例
s.

您不能在案例块内声明变量


事实上,这并不完全正确。应该可以帮助您澄清问题。

您不能在case块中声明变量


事实上,这并不完全正确。应该可以帮助你澄清问题。

这不是你问题的答案,但我很确定你会想在你的案例块末尾插入“break”。你的标题中包含了
,对吗?他们都记着:看起来他每一个都用
return
,所以
break是不必要的。很抱歉,FLOAT case被错误地复制了。我是从shell窗口复制的,而不是像我应该的那样从GUI文本编辑器复制的。---它少了几行。@Nick Bedford:是的,即使对我来说,这也是一个太基本的错误。无论如何,我已经接受了一个答案,但为了后代,我确实修复了问题的代码。:-)谢谢,e每个人,谢谢你的帮助。这不是你问题的答案,但我很确定你会想在你的案例块的末尾插入“break”。你已经包含了你的标题,对吗?他们都记得:看起来他用一个
返回来完成每一个,所以
break
是没有必要的。浮动案例是复制错误的埃德,对不起。我是从一个shell窗口复制,而不是像我应该的那样从GUI文本编辑器复制。---它少了几行。@Nick Bedford:是的,即使对我来说,这也是一个太基本的错误。无论如何,我已经接受了一个答案,但为了后代,我确实修复了问题的代码。:-)谢谢大家,谢谢你们的帮助。真的吗?我从来没有这样做过以前有麻烦吗