0

私はコンピュータ アーキテクチャ コースの sim を扱っています。gcc v4.5.2 で MSYS1.1/MinGW のパッケージをコンパイルしようとしています。

メイクログ:

    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 };

この構造体ブロックの何が問題になっていますか? 助けていただけますか?? ありがとう!

4

2 に答える 2

3

内部構造体に名前を付けることは許可されていないと思います。

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 };

「specifier-qualifier-list」は。のようなものの一部であるトークンのように聞こえるので、これは疑わしいですstruct dim = {0};

于 2011-05-03T20:55:06.443 に答える
1

C では、内部構造体に名前を付けることは許可されていません。これは、C で通常構造体を参照する必要があるためです。

struct A {
   ...
};

struct B {
    struct A my_a;
};

したがって、単純な C コンパイラには、変数または型宣言を期待する必要があるかどうかが不明です。

ただし、これは、C++ コンパイラを使用すると、期待どおりに動作する場合です。これは、C++ が可変減速の構造体プレフィックスを想定していないためです。

解決策は、内側の構造体から名前を削除するか、他の構造体の外側で宣言することです。

于 2011-05-03T21:06:04.540 に答える