结构的类型定义似乎没有在头文件中通过?

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 * 是有效的数据类型,但其他三个不是。 whichTypetype 函数不使用其他三种数据类型中的任何一种。

提前感谢您的帮助。我相当确定这与头文件中结构的位置有关,或者可能(但极不可能)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;

...其他cases 也类似。

【讨论】:

真的吗?我以前从来没有遇到过这个问题……考虑一下“case STRING”部分中的“for”循环——该声明也不是在块的开头。但我一定会尝试看看会发生什么。 好吧,我会的。就是这样。非常感谢。 +1 并为你打勾。 您说的是 C89 —— 在 C99 中,您可以在代码块中的任何位置定义变量,就像在 C++ 中一样。

以上是关于结构的类型定义似乎没有在头文件中通过?的主要内容,如果未能解决你的问题,请参考以下文章

函数原型认为一个类类型是未定义的,尽管它是在同一个头文件中定义的

ERP中通过自定义单打开流程图

C语言语法

Keil中C语言模块化编程时全局变量、结构体处理细节

结构体写在头文件中怎么写,在其它函数文件中怎么引用

结构体写在头文件中怎么写,在其它函数文件中怎么引用