Вы можете сделать объявление struct
перед его определением:
/* declaration */
struct foo;
.....
/* definition */
struct foo
{
....
};
Везде, где вы пишете struct foo
- это объявление структуры, поэтому вам не нужно помещать ее вВ отдельной строке вы можете указать это в typedef, объявлении указателя и т. д. Просто учтите, что иногда, как и в объявлениях переменных типа struct foo
, вам также необходимо определение (для вычисления размера переменной);
/* declare struct foo ..*/
struct foo;
/* .. or declare struct foo ..*/
typedef struct foo foo;
/* .. or declare struct foo ..*/
struct foo *p;
/* .. or declare struct foo */
int bar (struct foo *p);
/* Not valid since we don't have definition yet */
struct foo f1;
/* definition */
struct foo
{
....
};
/* Valid */
struct foo f2;
В вашем случае вы не дали структуре имя;вы только что создали typedef
, который является псевдонимом для анонимной структуры.Итак, чтобы объявить вашу структуру вперёд, вы должны дать ей имя:
/*
forward declare the `struct stage_table_context_t` and give it a typedef alias
with the same name as the structs name
*/
typedef struct stage_table_context_t stage_table_context_t;
typedef stage_table_context_t* (*stage_table_function_t)(stage_table_context_t*);
typedef struct {
const char* stage_name;
stage_table_function_t* function;
} stage_t;
struct stage_table_context_t{
uint32_t error_number;
stage_t* current_stage;
} stage_table_context_t;