Определение вложенной структуры - PullRequest
0 голосов
/ 04 мая 2011

Я имею дело с симом для курса по компьютерной архитектуре. Я пытаюсь скомпилировать пакет с MSYS1.1 / MinGW с gcc v4.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

Я проверил строку 214 в bpred.h, есть определение вложенной структуры как:

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

Что не так с этим структурным блоком? Не могли бы вы помочь? Спасибо!

Ответы [ 2 ]

3 голосов
/ 04 мая 2011

Я считаю, что вы не можете назвать внутреннюю структуру:

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

1 голос
/ 04 мая 2011

В C внутренним структурам не разрешено иметь имена, это связано с тем, что вам обычно нужно ссылаться на структуры в C:

struct A {
   ...
};

struct B {
    struct A my_a;
};

Таким образом, для наивного компилятора C неясно,следует ожидать переменную или объявление типа.

В этом случае, однако, при использовании компилятора c ++ он будет работать так, как вы ожидаете, поскольку C ++ не ожидает префикса структуры для переменнойзамедления.

Решение состоит в том, чтобы либо удалить имя из внутренней структуры, либо объявить его вне другой структуры.

...