Подтвердить что ты не робот

Почему некоторые функции в stdio имеют поток в качестве последнего аргумента?

Некоторые из функций в stdio, кажется, имеют поток в качестве последнего аргумента, например:

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

а некоторые - как первый аргумент:

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

Почему это несоответствие? Были ли эти функции добавлены в разное время в развитие стандартной библиотеки? В этом случае, которые были первыми, и почему было изменено соглашение?

Я понимаю, что для fprintf для друзей fprintf требуется более FILE* сначала FILE* (или, по крайней мере, раньше) из-за многоточия (и для fclose и аналогично иметь его первым и последним),

4b9b3361

Ответ 1

Я убежден, что ясный и очевидный ответ не будет найден в этом вопросе, хотя этот вопрос не основан на мнениях, поскольку существует четкий ответ, хотя он недоступен.

Однако я признаю разочарование по поводу проблемы: работать нелегко, если, помимо изучения имен функций и от того, от чего они зависят, запоминание порядка параметров для каждой функции по отдельности. Вместо этого было бы неплохо иметь последовательный порядок параметров.

Для этого можно реализовать последовательную библиотеку stdio, которая будет использовать согласованный порядок для параметров и будет обертывать каждую функцию stdio в такую ​​функцию. Пример:

int      mystdio_fseek(long, int, FILE *);

Это вернет результат

int      fseek(FILE *, long, int);

Таким образом, mystdio_ может быть префиксом, чтобы убедиться, что имена почти похожи, но разные, и порядок параметров будет согласован. Таким образом, нужно запомнить только имена функций, от которых зависит каждая функция, и больше не нужно будет запоминать порядок параметров для каждой функции по отдельности. Можно использовать эти методы, когда не будет необходимости в микро-оптимизации.