Специализни шаблонца! (udpn) wrote,
Специализни шаблонца!
udpn

return 0;

Это пост НЕНАВИСТИ.

Дело в том, что я уже неоднократно вижу в исходниках на С++ строку вынесенную в сабж. Большинство авторов не смогли дать адекватного ответа на вопрос "зачем это здесь". Давайте попробуем разобраться.

Есть такой пункт стандарта С++,

3.6.1.5 A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;.
3.6.1.5 Выражение return в процедуре main выходит из функции main (уничтожая все объекты с автоматической проверкой длительности хранения) и вызывает std::exit со значением, переданным в качестве аргумента return. Если вычисление достигнет конца функции main, не встретив выражение return, это будет эквивалентно вызову return 0;.

То есть, если мы не собираемся как-либо использовать возвращаемое значение, мы вообще не обязаны ничего писать. И не должны. Традиционные контраргументы: это повышает ясность кода. Но нет, синтаксис, оторванный от семантики, никак не может повышать ясность кода. return 0 это то же самое, что комментарий "здесь заканчивается процедура main". Такой стиль обычно не поощряется (int i; // это переменная i).

А что на самом деле происходит при завершении работы программы? Можете посмотреть дайджест. Приложение завершено успешно, если возвращает EXIT_SUCCESS (который может быть не 0), либо 0 (который обязан превратиться в EXIT_SUCCESS или его аналог). Здесь чувствуется какой-то привкус идиотизма, хотя читатель может со мной и не согласиться.

В этом ключе кажется вполне логичным позволить пользователю написать void main(). Некоторые компиляторы, кстати говоря, позволяют это сделать. Но в стандарте ничего подобного нет.

Теперь отдельно остановимся на кодах возврата. Они являются одной из важнейших составляющих программирования консольных утилит unix way. Кстати, вы когда-нибудь смотрели, сколько тактов требуется вашей ОС, чтобы создать процесс? Сколько-сколько сотен тысяч? Использование

  1. тяжеловесных протекающих абстракций (процессов)
  2. ключей командной строки, набор которых разрабатывается совершенно спонтанно
  3. текстовых файлов настроек в непредсказуемом формате
  4. названий файлов вместо более компьютеро-понятных числовых идентификаторов
  5. кодов возврата, набор которых появляется совершенно спонтанно, и которые почему-то обязаны быть именно числом

приводит к неортогональности, замедлению, makefile'ам и суткам компиляции всяких Gentoo.

Было бы куда разумнее иметь не приложения, а функции. Собрать несколько действий в цепочку было бы намного проще, исчезли бы лишние ключи, исчез бы лишний уровень абстракции, возросла бы скорость. Есть множество решений: мощный системный API, статические библиотеки, динамическая компиляция из исходников, whatever. Но из-за засилья лисперов и прочих копрофилов в рядах программистов, ничего не меняется уже долгие-долгие годы.

Собственно, отсюда и вытекают все скриптовые недоязыки, которыми полнятся дистрибутивы никсов. Кому нравятся sh, awk, perl, makefile'ы?

Глубокое удивление у меня вызывает желание некоторых людей всё это счастье стандартизировать. Появился POSIX, от содержимого которого у меня порой просто встают дыбом волосы по всему телу.

Возвращаюсь к return 0;. Эта строка -- концентрат маразма *nix, Си и С++. Не пишите её. Никогда.

UPD ещё обсуждение идёт здесь.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 61 comments