Если вы хотите, чтобы только быть в состоянии передавать указатели на fifo_t
вокруг, то вы можете только переслать-объявить его в файл заголовка. Однако typedef
для неназванных структур действует только при определении содержимого структуры. Поэтому, если вы не хотите компилировать struct fifo_t var;
, вам придётся использовать какое-то контр-интуитивное имя, может быть, что-то вроде fifo_t_
. Например:
typedef struct fifo_t_ fifo_t;
void fifo_use(fifo_t*); // ok, just uses pointer
А затем в файле .c
, делать (и, пожалуйста, обратите внимание, что при использовании запятой для отдельных членов не является допустимым синтаксисом):
struct fifo_t_ {
uint8_t *buffer;
uint8_t indexRead;
uint8_t indexWrite;
uint8_t used;
uint8_t size;
};
void fifo_use(fifo_t* f) {
f->indexRead = 1;
}
Кроме того, обратите внимание, что fifo_t var;
не будет потому что вам нужно знать размер структуры, чтобы выделить место для нее. То, что вы могли сделать, это использовать указатели внутри, таким образом, прозрачно для пользователя:
// in .h file:
typedef struct fifo_t_* fifo_t;
void fifo_init(fifo_t*);
void fifo_free(fifo_t);
void fifo_use(fifo_t);
// in .c file:
struct fifo_t_{
uint8_t *buffer;
uint8_t indexRead;
uint8_t indexWrite;
uint8_t used;
uint8_t size;
};
void fifo_init(fifo_t* f) {
*f = (fifo_t)malloc(sizeof(struct fifo_t_));
}
void fifo_free(fifo_t f) {
free(f);
}
void fifo_use(fifo_t f) {
f->indexRead = 1;
}
// somewhere else
int main() {
fifo_t fifo;
fifo_init(&fifo);
fifo_use(fifo);
fifo_free(fifo);
}
Вы не можете сделать это с сыром 'структуры сам. Вы можете сделать 'typedef' для непрозрачного _pointer_ в' struct'? Это приемлемо? Вы не можете фактически объявить 'fifo_t var;' в другом коде без полного определения структуры, потому что у другого кода не будет информации, чтобы выделить достаточно памяти для ее хранения. – ShadowRanger
Если вы хотите, чтобы структура была известна только в определенном исходном файле, почему бы просто не определить ее в исходном файле вместо файла заголовка? –
Необязательно, если вам нужна структура только в нескольких исходных файлах, но не в большинстве из них, затем создайте новый «закрытый» заголовок (например, «fifo_private.h') файл, содержащий эту структуру. –