воскресенье, 8 июля 2007 г.

int main() VS void main()

Итак, сегодня поговорим о функции main(), а именно о типе возвращаемого значения.
Многие начинающие программисты знают о функции main только то что это точка
входа консольного win32 приложения. О том какое значение должна возвращать
эта функция (да и должна-ли возвращать вообще) начинающий программер не
задумывается. Это происходит по ряду причин:
1. Мало где уделяется этому внимание, особенно в матерьялах для начинающих
2. В начале изучения языка о функциях не упоминается. А когда дело доходит
и до них, наш программер уже и думать не думает о main, о том что это в
точности такая-же функция как и те что он вручную пишет, и о том что из
main что-то должно возвращаться.
3. Ну и наконец-то, прога-то работает! Неважно как написать - int main(),
void main() или даже просто main(). Компайлер не ругается, линкер тоже,
выполнение программы проходит как по маслу. Однако не всё так хорошо как
может показаться на первый взгляд.

Итак, всё-таки void main или int main?
Как мне кажется, достаточно заглянуть в стандарт, и посмотреть что там
говорится о main. А согласно C++ Standart ANSI ISO, функция main должна
возвращать целое. То-же говорится и в ANSI C. Для примера можно написать
"хола, уолд" примерно так:

#include
void main()
{
printf("Hello, World!");
}


И если скомпилить это дело на компиляторе стандарта ANSI C, можно увидеть
что он выдаёт ряд предупреждений.

И всё-таки, почему не void?
Всё очень просто. По завершении программы, функция int main помещает
возвращаемое значение в стэк, к которому после этого может кто-либо
обратиться. Если-же main у нас ничего не возвращает, в стек, естественно,
ничего не помещается. И… как вы вероятно уже догадались, при попытке
обращения к результату в стеке, будет затронута "чужая" инормация. А
последствия могут быть катастрофическими! Ведь этой информацией может
оказаться "кусок" указателя, или еще что-то "неприкасаемое" :)

Подытоживая эту статью, хотелось-бы отметить что выбор в любом случае за
вами, однако стоит помнить и о возможных последствиях. Не стоит писать
программу которая будет "работать хоть как-то". Ведь рано или поздно мелкий
баг, который поначалу-то и багом не назовешь, может перерости в катастрофу.

by patison4eg at 27.02.07 (c)

Комментариев нет:

[Кодер]::Лого :) - просто как всё гениальное.