Nie jestem ekspertem od niskopoziomowych, nieobiektowych języków programowania, a ja jestem w trakcie pisania kodu C dla projektu w pracy. Próbuję stworzyć przyzwoite abstrakcyjne typy danych do pracy, a Google Googling uświadomił mi, że ludzie używają strukturalnych ADT na dwa sposoby. Niektóre osoby definiują typ danych jako strukturę:Kiedy powinieneś napisać struct struct vs pointer do struct?
typedef struct adt {
//content here
} adt;
i udostępnić go światu w pliku nagłówkowym.
Inne określić typ danych jako wskaźnik do struct:
// In .c file:
typedef struct adt_s {
//content here
} adt_s, *adt;
// In .h file:
typedef struct adt_s *adt;
Rozumiem, że takie podejście pozwala na typedef struct bez podania światem zewnętrznym żadnej wiedzy o tym, co znajduje się wewnątrz tej struktury, tak programistów może tylko użyć funkcji dostarczonych w tym samym pliku nagłówkowym, aby operować na tym typie danych.
Czy istnieją inne powody, by wybrać inne? Czy istnieje ogólna "reguła", kiedy definiujemy ADT jako struktury i kiedy definiujemy je jako wskaźniki do struktur?
Dla celów czytelności może lepiej napisać 'typedef struct S3_s * S3' zamiast' typedef struct S3_s * S3', nie? – Eregrith
@Egrith: jeśli przejdziesz przez formalną semantykę języka, 'typedef struct S3_s * S3' mówi, że deklarator' * S3' ma typ 'struct S3_s' i class przechowywania' typedef', więc umieszczenie gwiazdki z identyfikatorem jest faktycznie idiomatyczne ; jednak umieszczenie gwiazdki z typem jest bardziej dostosowane do tego, ile osób (najwięcej?) myśli o deklaracjach; o ile jestem przekonany, obie wersje są w porządku, o ile jesteś konsekwentny ... – Christoph
Właśnie wybrałem ten odstęp dla spójności z OP, ponieważ widzę korzyści w dowolny sposób. – Useless