Вопрос по c – Тип возврата основной функции [дубликат]
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 ++.
void
заmain()
позволено. Стандарт C ++ запрещает это полностью.
Стандарт C говорит, что стандартными формами являются:
int main(void) { ... }
а также
int main(int argc, char **argv) { ... }
разрешение альтернативных, но эквивалентных форм объявления для типов аргументов (и имена, разумеется, являются полностью дискреционными, поскольку они являются локальными переменными для функции).
Стандарт С действительно предусматривает небольшое положение для «в некотором другом, определенном реализацией способе». Стандарт ISO / IEC 9899: 2011 гласит:
5.1.2.2.3 Program terminationIf 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 extensionsThe 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 argumentsIn 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).
void main()
work?
Вопрос отмечает, чтоvoid main()
работает. Это работает. потому что компилятор делает все возможное, чтобы генерировать код для программ. Компиляторы, такие как GCC, будут предупреждать о нестандартных формах дляmain()
, но обработаем их. Линкер не слишком беспокоится о типе возвращаемого значения; ему просто нужен символmain
(или возможно_main
в зависимости от системы) и когда он находит его, связывает его в исполняемый файл. Код запуска предполагает, чтоmain
был определен стандартным образом. Еслиmain()
возвращается к коду запуска, он собирает возвращенное значение, как будто функция вернулаint
, но это значение, вероятно, будет мусором. Так что, похоже, это работает, пока вы не ищите статус выхода вашей программы.
void main()
с различными списками аргументов как действительными. УвидетьWhat should main()
return in C and C++ для полной информации.
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 что такая подпись разрешена. В противном случае поведение не определено, что означает, что компилятор может делать все, что захочет. Программа может выполняться без проблем. Может выполняться, но оставить среду в плохом состоянии. Может выйти из строя при выходе. Может вообще не загружаться.
но он больше не считается "безопасным". Под C99 это больше не приемлемо.
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?id=1043284376&answer=1044841143