The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка программирования Rust 1.58"
Отправлено Ordu, 14-Янв-22 16:39 
> как минимум переменное число параметров есть не только в *print*(), но и в *scan*(), *exec*() и даже open().

Есть не только в printf, да. Но если в printf/scanf без этого сложно обойтись, то в exec и open без проблем вообще. Я вот чесслово не понимаю, нахрена нужно было плодить десяток функций exec*, вполне достаточно было бы одной execve.

> Да и так, бывает очень удобно использовать и в своих функциях

Например когда и зачем? Ты можешь привести последнюю функцию такого рода, которую ты писал? Я по-моему ничего не писал с эллипсисом, кроме обёрток над printf. Во всех остальных случаях можно как-нибудь иначе, типа передать массив с аргументами, например. Массив удобнее: его легко прокинуть куда-то ещё, а va_list -- это очень специальная хрень, которую надо специальным образом прокидывать, и поэтому специально под неё запиливать декларации функций, и весь код обрастает этими va_list, преобразованиями va_list в массив, причём в обратную сторону ты замучаешься преобразовывать, и только системно зависимо, и... короче это безумие.

На самом деле, если посмотреть на код glibc, или даже на документацию, то безумие становится явным:

man 3 printf:

PRINTF(3)                     Linux Programmer's Manual                     PRINTF(3)

NAME
       printf,  fprintf,  dprintf,  sprintf,  snprintf,  vprintf, vfprintf, vdprintf,
       vsprintf, vsnprintf - formatted output conversion

SYNOPSIS
       #include <stdio.h>

       int printf(const char *restrict format, ...);
       int fprintf(FILE *restrict stream,
                   const char *restrict format, ...);
       int dprintf(int fd,
                   const char *restrict format, ...);
       int sprintf(char *restrict str,
                   const char *restrict format, ...);
       int snprintf(char *restrict str, size_t size,
                   const char *restrict format, ...);

       #include <stdarg.h>

       int vprintf(const char *restrict format, va_list ap);
       int vfprintf(FILE *restrict stream,
                   const char *restrict format, va_list ap);
       int vdprintf(int fd,
                   const char *restrict format, va_list ap);
       int vsprintf(char *restrict str,
                   const char *restrict format, va_list ap);
       int vsnprintf(char *restrict str, size_t size,
                   const char *restrict format, va_list ap);

А в glibc ещё есть asprintf и vasprintf. А ещё есть исторические *wprintf*. А, ещё в ncurses есть *printw, тоже дублированные. Функций было бы в два раза меньше, если бы аргументы передавались бы указателем на массив. Истинно говорю -- это путь к безумию.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру