C 嵌套结构定义

C 嵌套结构定义,c,sim-card,C,Sim Card,我在处理计算机架构课程的sim卡。我尝试用MSYS1.1/MinGW和gccv4.5.2编译包 Makelog: In file included from sim-outorder.c:107:0: bpred.h:214:5: error: expected specifier-qualifier-list before 'uint' ... make: *** [sim-outorder.o] Error 1 我检查了bpred.h中的第214行

我在处理计算机架构课程的sim卡。我尝试用MSYS1.1/MinGW和gccv4.5.2编译包

Makelog:

    In file included from
    sim-outorder.c:107:0: bpred.h:214:5:
    error: expected specifier-qualifier-list before 'uint'
    ... 
    make: *** [sim-outorder.o] Error 1
我检查了bpred.h中的第214行,其中有一个嵌套结构定义:

208 /* branch predictor update information */ 
209 struct bpred_update { 
210 char *pdir1;         /* direction-1 predictor counter */ 
211 char *pdir2;         /* direction-2 predictor counter */ 
212 char *pmeta;  /* meta predictor counter */ 
213 struct dir{             /* predicted directions */ 
214  uint bimod  : 1;    /* bimodal predictor */ 
215  uint twolev : 1;    /* 2-level predictor */ 
216  uint meta   : 1;    /* meta predictor (0..bimod / 1..2lev) */ 
217 } dir; 
218 };
这个结构块怎么了? 你能帮忙吗??
谢谢

我认为不允许您命名内部结构:

208 /* branch predictor update information */ 
209 struct bpred_update { 
210 char *pdir1;         /* direction-1 predictor counter */ 
211 char *pdir2;         /* direction-2 predictor counter */ 
212 char *pmeta;  /* meta predictor counter */ 
213 struct     {             /* predicted directions */  
/******    ^^^^ --- NO NAME HERE -- THIS IS WHAT YOU MUST CHANGE */
214  uint bimod  : 1;    /* bimodal predictor */ 
215  uint twolev : 1;    /* 2-level predictor */ 
216  uint meta   : 1;    /* meta predictor (0..bimod / 1..2lev) */ 
217 } dir; 
218 };

我怀疑这是因为“说明符限定符列表”听起来像是一个标记,它是
struct dim={0}的一部分

我认为您被禁止命名内部结构:

208 /* branch predictor update information */ 
209 struct bpred_update { 
210 char *pdir1;         /* direction-1 predictor counter */ 
211 char *pdir2;         /* direction-2 predictor counter */ 
212 char *pmeta;  /* meta predictor counter */ 
213 struct     {             /* predicted directions */  
/******    ^^^^ --- NO NAME HERE -- THIS IS WHAT YOU MUST CHANGE */
214  uint bimod  : 1;    /* bimodal predictor */ 
215  uint twolev : 1;    /* 2-level predictor */ 
216  uint meta   : 1;    /* meta predictor (0..bimod / 1..2lev) */ 
217 } dir; 
218 };

我怀疑这是因为“说明符限定符列表”听起来像是一个标记,它是
struct dim={0}的一部分

在C中,内部结构不允许有名称,这是由于您通常需要引用C中的结构:

struct A {
   ...
};

struct B {
    struct A my_a;
};
因此,对于一个幼稚的C编译器来说,它不清楚是否需要一个变量或类型声明

这是一个使用C++编译器的情况,它会像你所期望的那样工作,因为C++不期望结构减速的前缀。


解决方案是从内部结构中删除名称,或者在另一个结构之外声明名称。

在C中,内部结构不允许有名称,这是由于您通常需要引用C中的结构:

struct A {
   ...
};

struct B {
    struct A my_a;
};
因此,对于一个幼稚的C编译器来说,它不清楚是否需要一个变量或类型声明

这是一个使用C++编译器的情况,它会像你所期望的那样工作,因为C++不期望结构减速的前缀。


解决方案是从内部结构中删除名称,或者在另一个结构外部声明名称。

其中定义了
uint
struct unsigned int uint;此外,案件已获解决。谢谢其中定义了
uint
struct unsigned int uint;此外,案件已获解决。谢谢这个问题特定于任何g++版本?我检查了包,似乎没有必要将内部结构移出。>dir\u update\u ptr->dir.meta=(*meta>=2);对不起,我不明白你的问题。。。首先,原来的问题是关于C,不是C++,G++是C++编译器,不是C编译器。此外,您认为不需要将内部结构移出是什么意思?您没有收到编译器错误吗?无论如何,这只是解决原始编译器错误的两个选项之一。为什么不能在另一个结构中命名struct?此问题特定于任何g++版本?我检查了包,似乎没有必要将内部结构移出。>dir\u update\u ptr->dir.meta=(*meta>=2);对不起,我不明白你的问题。。。首先,原来的问题是关于C,不是C++,G++是C++编译器,不是C编译器。此外,您认为不需要将内部结构移出是什么意思?您没有收到编译器错误吗?无论如何,这只是解决原始编译器错误的两个选项之一。为什么不能在另一个结构中命名struct?