结构的类型定义似乎没有在头文件中通过?
Posted
技术标签:
【中文标题】结构的类型定义似乎没有在头文件中通过?【英文标题】:typedefs of structs not seeming to go through in header files? 【发布时间】:2010-12-05 05:11:14 【问题描述】:我在头文件中的一些结构 typedef 声明似乎没有通过我的实现文件时遇到一些问题。
具体来说,我定义了以下类型:Type、Value、Integer、String 和 Float。它们都是以完全相同的方式从结构名称中定义的。我正在编写一个非正式的hashCode
函数来补充我正在设计的引用所有这些数据类型的哈希表。 Type 和 Value 可以正常工作,但 Integer/Float/String 不能正常工作,我不知道为什么。
抱歉,这个问题有点牵扯,但我会尽量不要提供太多或太少的信息,也许这对这里的专家来说不会太难。 :-)
我将从 hashCode 函数开始(请不要对我说它有多糟糕,我知道它并不是那么好,我真的不在乎):
int hashCode(ST_HashSymbol *hash, Value *v) 类型 *t = v->type; 开关 (whichType(t->name)) 案例整数: 整数 *i = (整数 *)v->innerValue; 返回 i->value % 哈希->容量; 案例浮动: 浮点 *f = (浮点 *)v->innerValue; 浮动 val = f-> 值; 长 l = 0l; 如果 (val 2 && j = 0; --j) if (val >= pow(2, j - 22)) val -= pow(2, j - 22); l |= 1 个容量; 案例字符串: 字符串 *s = (字符串 *)v->innerValue; 字符 *str = s-> 值; 整数 = 0; 字符 *c; for (c = str; *c != '\0'; ++c) 总计 += *c; 返回总 % 哈希-> 容量; 默认: 返回-1;
摘自“type.h”头文件,它定义了所有类型。值得注意的是,我也尝试过将 typedef 和 struct 定义组合为一个语句,但这也不起作用:
typedef struct _t 类型; typedef struct _v 值; 结构 _t 字符*名称; 结构 _t *widerType; ; 结构 _v 类型 *类型; 无效*内部值; ; 类型 *type(int); int whichType(char *); 输入 *getType(char *); /******************************/ /* 实际(“内部”)类型 */ /******************************/ typedef struct _str 字符串; typedef struct _int 整数; typedef struct _fl 浮点数; 结构 _str 整数长度; 字符 * 值; ; 结构 _int 整数值; ; 结构 _fl 浮点值; ;当我运行 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:在函数“hashCode”中: hash.c:33:错误:“整数”之前的预期表达式 hash.c:34: error: ‘i’ undeclared (first use in this function) hash.c:34: error: (每个未声明的标识符只报告一次 hash.c:34:错误:对于它出现的每个函数。) hash.c:37:错误:'Float'之前的预期表达式 hash.c:38: error: ‘f’ undeclared (first use in this function) hash.c:69:错误:“字符串”之前的预期表达式 hash.c:70: error: ‘s’ undeclared (第一次在这个函数中使用) make: *** [eq] 错误 1
正如我所提到的,Type * 和 Value * 是有效的数据类型,但其他三个不是。 whichType
和 type
函数不使用其他三种数据类型中的任何一种。
提前感谢您的帮助。我相当确定这与头文件中结构的位置有关,或者可能(但极不可能)gcc 本身。
【问题讨论】:
不是你的问题的答案,但我很确定你会想要在你的案例块的末尾插入'break'。 你有#included
你的标题,对吧?
theycallmemorty:看起来他每个人都用return
完成,所以break
不是必需的。
FLOAT 案例被错误复制,抱歉。我正在从 shell 窗口复制,而不是像我应该的那样使用 GUI 文本编辑器。 -_- 它缺少几行。 @Nick Bedford:是的,即使对我来说,这也是一个过于初级的错误。
无论如何,我已经接受了答案,但为了后代,我确实修复了问题的代码。 :-) 谢谢大家,你们的帮助。
【参考方案1】:
您不能在 case 块中声明变量。
这并不是 完全 实际上。 See here.应该能帮你搞定。
【讨论】:
信息量很大。我从来不知道——这太奇怪了。我真的希望 gcc 能清楚地说明这一点,但我很久以前就知道 gcc 几乎从不冗长,即使它总是正确的。感谢您的回复。 如果您认为case
的真实面目,那就没有什么奇怪的了。它不是一个块,它只是一个标签,switch
是一个计算出来的goto
。这就是为什么 case
可以位于 while
循环内的原因,例如,只要 while
循环在 switch
内(因此我们到达了 Duff 的设备)。【参考方案2】:
在 C 中,您只能在块的开头声明一个变量。您的线路:
Integer *i = (Integer *)v->innerValue;
试图声明一个变量i,但它不是在一个块的开始。你可以通过打开一个块来解决这个问题:
case INTEGER:
Integer *i = (Integer *)v->innerValue;
return i->value % hash->capacity;
...其他case
s 也类似。
【讨论】:
真的吗?我以前从来没有遇到过这个问题……考虑一下“case STRING”部分中的“for”循环——该声明也不是在块的开头。但我一定会尝试看看会发生什么。 好吧,我会的。就是这样。非常感谢。 +1 并为你打勾。 您说的是 C89 —— 在 C99 中,您可以在代码块中的任何位置定义变量,就像在 C++ 中一样。以上是关于结构的类型定义似乎没有在头文件中通过?的主要内容,如果未能解决你的问题,请参考以下文章