Вопрос по c – Тип возврата основной функции [дубликат]

7

Possible Duplicate:
What should main() return in C/C++?
Difference between void main and int main?

Я всегда использовал основной метод в C, как

void main(){ // my code }

и это работает довольно хорошо для меня. Я тоже знаю о другомint тип возврата:

int main(void)
int main()
int main(int argc, char *argv[])

Но я не смог найти какой-либо ресурс, который говорит, что я могу использоватьvoid в качестве типа возврата. Каждая книга предполагает, что тип возвращаемого значения должен бытьint или иначе это будет опущено. Тогда почемуvoid main() Работа?

Это зависит от версии C, которую я использую? Или это работает, потому что я использую C ++ IDE? Пожалуйста, ответьте конкретно на C, а не на C ++.

Ваш Ответ

5   ответов
11

void заmain() позволено. Стандарт C ++ запрещает это полностью.

Стандарт C говорит, что стандартными формами являются:

int main(void) { ... }

а также

int main(int argc, char **argv) { ... }

разрешение альтернативных, но эквивалентных форм объявления для типов аргументов (и имена, разумеется, являются полностью дискреционными, поскольку они являются локальными переменными для функции).

Стандарт С действительно предусматривает небольшое положение для «в некотором другом, определенном реализацией способе». Стандарт ISO / IEC 9899: 2011 гласит:

5.1.2.2.3 Program termination

If the return type of the main function is a type compatible with int, a return from the initial call to the main function is equivalent to calling the exit function with the value returned by the main function as its argument;11) reaching the } that terminates the main function returns a value of 0. If the return type is not compatible with int, the termination status returned to the host environment is unspecified.

11) In accordance with 6.2.4, the lifetimes of objects with automatic storage duration declared in main will have ended in the former case, even where they would not have in the latter.

Это явно позволяетint возвращает, но дает понять, что он не указан. Так,void может быть разрешено в качестве типа возвратаmain() при некоторой реализации, но вы можете найти это только в документации.

(Хотя я цитирую стандарт C2011, по сути, те же слова были в C99, и я верю в C89, хотя мой текст для этого находится в офисе, а я нет.)

Кстати, в приложении J к стандарту упоминается:

J.5 Common extensions

The following extensions are widely used in many systems, but are not portable to all implementations. The inclusion of any extension that may cause a strictly conforming program to become invalid renders an implementation nonconforming. Examples of such extensions are new keywords, extra library functions declared in standard headers, or predefined macros with names that do not begin with an underscore.

J.5.1 Environment arguments

In a hosted environment, the main function receives a third argument, char *envp[], that points to a null-terminated array of pointers to char, each of which points to a string that provides information about the environment for this execution of the program (5.1.2.2.1).

Why does void main() work?

Вопрос отмечает, чтоvoid main() работает. Это работает. потому что компилятор делает все возможное, чтобы генерировать код для программ. Компиляторы, такие как GCC, будут предупреждать о нестандартных формах дляmain(), но обработаем их. Линкер не слишком беспокоится о типе возвращаемого значения; ему просто нужен символmain (или возможно_mainв зависимости от системы) и когда он находит его, связывает его в исполняемый файл. Код запуска предполагает, чтоmain был определен стандартным образом. Еслиmain() возвращается к коду запуска, он собирает возвращенное значение, как будто функция вернулаint, но это значение, вероятно, будет мусором. Так что, похоже, это работает, пока вы не ищите статус выхода вашей программы.

Примечание: Microsoft определяетvoid main() с различными списками аргументов как действительными. УвидетьWhat should main() return in C and C++ для полной информации.
0

main() возвращатьint, но многие компиляторы Си позволяют вам указать тип возвращаемого значенияmain() какvoid.

Я рекомендую вам привыкнуть возвращатьсяint, Добавление

return 0;

до конца вашегоmain() не слишком много усилий.

См. 5.1.2.2.3 выше в ответе Джонатана Леффлера. Это также верно для C ++.
@hamstergene Я не думаю, что это гарантировано. Любая цитата?
Там нет необходимостиreturn 0 & # X2014; выпадать изmain без возврата значения гарантирует возврат0.
В любом случае, я думаю, что лучше добавитьreturn 0; к концу. У меня обычно есть некоторыеreturn 1;s в начале основной в случае ошибок, поэтому наличиеreturn 0 делает программу болееcomplete.
0

но void main не везде компилируется. Я видел компиляторы, которые не будут компилировать программу с void main. Я не могу вспомнить конкретный случай (для c), но я точно знаю, что это происходит в g ++ (да, я знаю, что это c ++).

2

рот лошади:

5.1.2.2.1 Program startup 1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters:

    int main(void) { /* ... */ }
or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared):

    int main(int argc, char *argv[]) { /* ... */ }
or equivalent;9) or in some other implementation-defined manner. 9) Thus, int can be replaced by a typedef name defined as int, or the type of argv can be written as char ** argv, and so on.

Лазейка - это «какой-то другой определенный реализацией способ». Реализацияmay разрешатьmain возвращатьvoid (или любой другой тип), но этоmust explicitly document что такая подпись разрешена. В противном случае поведение не определено, что означает, что компилятор может делать все, что захочет. Программа может выполняться без проблем. Может выполняться, но оставить среду в плохом состоянии. Может выйти из строя при выходе. Может вообще не загружаться.

-1

но он больше не считается "безопасным". Под C99 это больше не приемлемо.

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143

Void main () никогда не был разрешен стандартом. В статье, на которую вы ссылаетесь, речь идет об «вообще не возвращаемом типе». - & GT; & GT; по умолчанию int.

Похожие вопросы