结构的typedef似乎不会在头文件中经过?

时间:2009-10-09 01:56:21

标签: c gcc typedef struct

我在头文件中遇到一些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 *是有效的数据类型,但其他三种都不是。 whichTypetype函数不使用其他三种数据类型。

提前感谢您的帮助。我很确定这必须与头文件中结构的位置有关,或者可能(但非常不可能)gcc本身。

2 个答案:

答案 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的类似。