Non sono un esperto di linguaggi di programmazione di livello inferiore non orientato agli oggetti e sono nel mezzo della scrittura di un codice C per un progetto al lavoro. Sto cercando di creare alcuni tipi di dati astratti decenti con cui lavorare, e Googling mi ha fatto capire che le persone usano gli ADT basati su struct in due modi. Alcune persone definiscono un tipo di dati come struct:Quando dovrei typedef struct vs. pointer to struct?
typedef struct adt {
//content here
} adt;
ed espongono al mondo nel file di intestazione.
Altri definiscono un tipo di dati come puntatorea struct:
// In .c file:
typedef struct adt_s {
//content here
} adt_s, *adt;
// In .h file:
typedef struct adt_s *adt;
Capisco che questo approccio consente di typedef una struttura senza dare al mondo esterno alcuna conoscenza di ciò che è dentro questa struct, quindi i programmatori può solo utilizzare le funzioni fornite nello stesso file di intestazione per operare su questo tipo di dati.
Ci sono altri motivi per scegliere l'altro? Esiste una "regola generale" generale per quando definiscono gli ADT come strutture e quando li definiamo come indicatori delle strutture?
Per scopi di leggibilità forse è meglio scrivere 'typedef struct S3_s * S3' invece di' typedef struct S3_s * S3', no? – Eregrith
@Eregrith: se si usa la semantica del linguaggio formale, 'typedef struct S3_s * S3' dice che il dichiaratore' * S3' ha tipo 'struct S3_s' e la classe di memoria' typedef', quindi mettere l'asterisco con l'identificatore è effettivamente idiomatico ; tuttavia, mettere l'asterisco con il tipo è più in sintonia con quante (la maggior parte?) le persone pensano alle dichiarazioni; per quanto mi riguarda, entrambe le versioni vanno bene finché sei coerente ... – Christoph
Ho appena selezionato quella spaziatura per coerenza con l'OP, dal momento che posso vedere i benefici in entrambi i modi. – Useless