порядок двух структур - PullRequest
       2

порядок двух структур

1 голос
/ 08 августа 2011

У меня есть эти две структуры ...

typedef struct{
    MY_SECOND_STRUCT  s1;
}MY_FIRST_STRUCT;


typedef struct{
    int s1;
}MY_SECOND_STRUCT;

Я предпочитаю этот порядок, я не хочу их переключать.Но компилятор не знает MY_SECOND_STRUCT в данный момент, и я получаю ошибку

error: ожидаемый список спецификаторов-спецификаторов до 'MY_SECOND_STRUCT'

Я пытался добавить объявление вtop

struct MY_SECOND_STRUCT;

также измените определение на

typedef struct{
    struct MY_SECOND_STRUCT  s1;
}MY_FIRST_STRUCT;

, но это не помогло.

Ответы [ 3 ]

8 голосов
/ 08 августа 2011

Я предпочитаю этот порядок, я не хочу их переключать.

Вы должны переключать их.

Если MY_FIRST_STRUCT имеет переменную-член типа MY_SECOND_STRUCT затем MY_SECOND_STRUCT должен быть определен и завершен (не только объявлен и неполон) перед определением MY_FIRST_STRUCT.

3 голосов
/ 08 августа 2011

Этот заказ невозможен.Вы должны переключить их.

Однако, если вы объявляете элемент указателем, переключение не требуется:

struct MY_SECOND_STRUCT; //forward declaration is required though

typedef struct{
    MY_SECOND_STRUCT  * s1;  //now its a pointer
}MY_FIRST_STRUCT;

Или в C ++ вы можете использовать шаблон как:

template<typename MY_SECOND_STRUCT>
struct MY_FIRST_STRUCT_T
{
    MY_SECOND_STRUCT  s1;
};

struct MY_SECOND_STRUCT
{
    int s1;
};

А когда вы хотите использовать MY_FIRST_STRUCT, просто используйте это typedef:

typedef MY_FIRST_STRUCT_T<MY_SECOND_STRUCT> MY_FIRST_STRUCT;

Используйте MY_FIRST_STRUCT сейчас.: -)

1 голос
/ 08 августа 2011

Во время создания вашей первой структуры компилятор еще не сталкивался со второй структурой.Он должен знать, каков бит MY_SECOND_STRUCT, потому что в это время ему нужно решить, насколько большим сделать MY_FISRT_STRUCT и как распределить память для него.Простого объявления структуры struct MY_FIRST_STRUCT недостаточно, что не говорит компилятору о размере или содержимом структуры.Прямое объявление сработало бы, если бы вы использовали указатель на структуру, но этого недостаточно при попытке включить фактическую структуру.

Ваши единственные реальные варианты - переместиться на MY_SECOND_STRUCT выше MY_FIRST_STRUCT или заставить MY_FIRST_STRUCT взять указатель.Поначалу это может показаться странным, но с этим ничего не поделаешь.

...