2016-02-24 17 views
10

stdio fonksiyonlardan bazıları, örneğin son argüman olarak akışı var gibi:stdio'daki bazı işlevler akışı son argüman olarak neden yapıyor?

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); 

bazı ilk argüman olarak varken:

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

Neden bu tutarsızlık mı? Bu fonksiyonlar standart kütüphanenin gelişiminde farklı zamanlarda mı eklendi? İlk olarak hangi durumda ve neden kongre değişti?

Ben fazla veya daha az olması arkadaşlarıyla fprintf için gerekli olduğunun farkına FILE* ilk (ya da en azından erken) nedeniyle üç nokta için (ve fclose ve benzeri için önce onu var ve son kadar).

+15

C kütüphanesi kendi API'si hakkında kesinlikle hiçbir şey tutarlı kuralda son derece tutarlıdır. –

+0

Başka bir örnek, sırayla argümanlara sahip olan fandrittir: boyut, sayı, calloc, qsort, bsearch ise bu argümanları tersine çevirir. – 2501

+0

En azından, konumsal yöntemlerin ilk parametreyi dosya tanıtıcısı olarak beklerken, arabelleğin i/o yöntemleri arabelleği önce beklediği konusunda tutarlılık gösterirler. –

cevap

3

Bu soruya açık ve net bir yanıt bulunamayacağına inanıyorum, ancak bu soruya ulaşılamıyor olsa da, bu soru kanaat temelli değil, açık bir cevap var.

Ancak, sorun hakkında hayal kırıklığı tanımak: Bir kolayca işlev adlarını ve ne tek tek her işlev için parametre sırasını ezberlemek bağlıdır öğrenme yanında, eğer çalışamaz. Bunun yerine tutarlı bir parametre sırasına sahip olmak güzel olurdu.

Bunu başarmak için, bir parametre için tutarlı düzeni kullanmak ve böyle bir fonksiyonu haline her stdion işlevini örtecek tutarlı stdion kütüphane, uygulayabilir. Örnek: Bu

int  fseek(FILE *, long, int); 

sonucunu döndürecektir

int  mystdio_fseek(long, int, FILE *); 

Yani, mystdio_ isimleri neredeyse benzer, ama farklı olup parametre sırası tutarlı olurdu emin olmak için bir önek olabilir. Bu şekilde, yalnızca işlev adlarını, her bir işlevin neye bağlı olduğunu ve her bir işlev için parametre sırasını ayrı ayrı ezberlemeye artık gerek olmadığını hatırlamak gerekir. Mikro optimizasyona ihtiyaç duyulmayacak olduğunda bu yöntemler kullanılabilir.

+1

@ 2501, Mystdio'nun daha iyi bir önek olacağını kabul ediyorum. –

+5

C işlevi parametre sırası için fiili standart genellikle (soldan sağa): hedef, kaynak (varsa), diğer şeyler. (Örneğin, 'memcpy'/'strcpy' parametresi sırası çok kanoniktir). Eğer buna yapışırsa, o zaman “fseek” doğru sırasına sahiptir, “fprintf (FILE * ...” doğru sırasına sahiptir ve diğer işlevler yanlış sıraya sahiptir. – Lundin

İlgili konular