Определение вложенной структуры

#c #sim-card

#c #sim-карта

Вопрос:

Я имею дело с курсом sim for computer architecture. Я пытаюсь скомпилировать пакет с MSYS1.1 / MinGW с помощью gcc версии 4.5.2.

Список изменений:

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

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

Комментарии:

1. Где uint определено?

2. struct unsigned int uint; добавлен, случай решен. Спасибо!!

Ответ №1:

Я полагаю, что вам запрещено называть внутреннюю структуру:

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

Ответ №2:

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

 struct A {
   ...
};

struct B {
    struct A my_a;
};
  

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

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

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

Комментарии:

1. эта проблема характерна для любой версии g ? я проверяю пакет, кажется, что нет необходимости перемещать внутреннюю структуру. >dir_update_ptr->dir.meta = (*meta >= 2);

2. Извините, я не понял вашего вопроса… Прежде всего, первоначальный вопрос касается C, а не C , g — это компилятор C , а не компилятор C. Кроме того, что вы имеете в виду, говоря, что нет необходимости перемещать внутреннюю структуру? Разве вы не получали ошибку компилятора? В любом случае, это был всего лишь один из двух вариантов устранения исходной ошибки компилятора.

3. почему вы не можете указать именованную структуру в другой структуре?