2016-02-24 29 views
10

Alcune delle funzioni in stdio sembrano avere il flusso come ultimo argomento, ad esempio:Perché alcune funzioni in stdio hanno lo stream come ultimo argomento?

char *fgets(char *restrict, int, FILE *restrict); 
int  fputs(const char *restrict, FILE *restrict); 
size_t fread(void *restrict, size_t, size_t, FILE *restrict); 
size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict); 

mentre alcuni hanno come primo argomento:

int  fgetpos(FILE *restrict, fpos_t *restrict); 
int  fseek(FILE *, long, int); 

Perché questa incongruenza? Queste funzioni sono state aggiunte in momenti diversi nell'evoluzione della libreria standard? In quel caso che erano i primi e perché la convenzione è cambiata?

mi rendo conto che è più o meno il necessario per fprintf con gli amici per avere il FILE* prima (o almeno all'inizio) a causa della puntini di sospensione (e per fclose e simile ad avere per primo, e l'ultimo).

+15

La libreria C è estremamente coerente nella regola che assolutamente nulla della sua API è coerente. –

+0

Un altro esempio è fread, in cui gli argomenti sono fwrite: size, count, mentre calloc, qsort, bsearch hanno questi argomenti al contrario. – 2501

+0

Almeno sono coerenti nel senso che i metodi posizionali si aspettano il primo parametro come l'handle del file, mentre i metodi i/o con il buffer si aspettano prima il buffer. –

risposta

3

Sono convinto che una risposta chiara ed evidente non sarà trovata a questa domanda, anche se, questa domanda non è basata sull'opinione, poiché esiste una risposta chiara da qualche parte, anche se è irraggiungibile.

Tuttavia, riconosco la frustrazione relativa al problema: non si può facilmente lavorare se, oltre all'apprendimento dei nomi delle funzioni e di cosa dipendono, memorizzando l'ordine dei parametri per ciascuna funzione individualmente. Invece, sarebbe bello avere un ordine coerente dei parametri.

Per ottenere ciò, è possibile implementare una libreria stdio coerente, che userebbe un ordine coerente per i parametri e avvolgere ciascuna funzione stdio in tale funzione. Esempio:

int  mystdio_fseek(long, int, FILE *); 

Ciò restituire il risultato di

int  fseek(FILE *, long, int); 

Così, il mystdio_ potrebbe essere un prefisso per assicurarsi che i nomi sono quasi simili, ma diversi e l'ordine dei parametri sarebbero coerenti. In questo modo, è necessario ricordare solo i nomi delle funzioni, da cosa dipende ciascuna funzione e non sarà più necessario memorizzare l'ordine dei parametri per ciascuna funzione singolarmente. Si potrebbero usare questi metodi ogni volta che non ci sarà bisogno di micro-ottimizzazione.

+1

@ 2501, sono d'accordo con te che mystdio_ sarebbe un prefisso migliore. –

+5

Lo standard di fatto per l'ordine dei parametri della funzione C è generalmente (da sinistra a destra): destinazione, origine (se applicabile), altre cose. (Ad esempio, l'ordine dei parametri di 'memcpy' /' strcpy' è molto canonico). Se ci si attiene a questo, allora 'fseek' ha l'ordine corretto,' fprintf (FILE * ... 'ha l'ordine corretto e le altre funzioni hanno l'ordine errato. – Lundin

Problemi correlati