Какова правильная подпись main
функции в C ++? Каков правильный тип возвращаемого значения и что означает возвращать значение main
? Каковы допустимые типы параметров и каковы их значения?
Это зависит от системы? Изменились ли эти правила с течением времени? Что произойдет, если я нарушу их?
main
возвращаться в C и C ++ , или является его копией .Ответы:
main
Функция должна быть объявлена как функция , не являющихся членами в глобальном пространстве имен. Это означает, что она не может быть статической или нестатической функцией-членом класса, а также не может быть помещена в пространство имен (даже в безымянное пространство имен).Имя
main
не зарезервировано в C ++ за исключением функции в глобальном пространстве имен. Вы можете объявлять другие именованные сущностиmain
, в том числе классы, переменные, перечисления, функции-члены и функции, не являющиеся членами, не входящие в глобальное пространство имен.Вы можете объявить функцию, названную
main
в качестве функции-члена или в пространстве имен, но такая функция не будетmain
функцией, определяющей место запуска программы.main
Функция не может быть объявлена какstatic
илиinline
. Это также не может быть перегружено;main
в глобальном пространстве имен может быть только одна функция .main
Функция не может быть использована в вашей программе: вы не можете вызватьmain
функцию из любого места в коде, ни вы разрешили взять его адрес.Тип возврата
main
должен бытьint
. Никакой другой возвращаемый тип не допускается (это правило выделено жирным шрифтом, поскольку очень часто встречаются неправильные программы, которые декларируютmain
с возвращаемым типомvoid
; это, вероятно, наиболее часто нарушаемое правило, касающеесяmain
функции).Есть две декларации,
main
которые должны быть разрешены:В (1) нет параметров.
В (2) есть два параметра, и они условно названы
argc
иargv
, соответственно.argv
является указателем на массив строк C, представляющих аргументы программы.argc
количество аргументов вargv
массивеОбычно
argv[0]
содержит название программы, но это не всегда так.argv[argc]
гарантированно будет нулевым указателем.Обратите внимание, что поскольку аргумент типа массива (like
char*[]
) на самом деле является просто скрытым аргументом типа указателя, следующие два являются допустимыми способами write (2), и оба они означают одно и то же:Некоторые реализации могут разрешать другие типы и числа параметров; вам нужно будет проверить документацию вашей реализации, чтобы увидеть, что она поддерживает.
main()
как ожидается, вернет ноль, чтобы указать успех и ненулевое, чтобы указать сбой. Вы не обязаны явно писатьreturn
утверждение вmain()
: если вы разрешитеmain()
return без явногоreturn
утверждения, оно будет таким же, как если бы вы написалиreturn 0;
. Следующие двеmain()
функции имеют одинаковое поведение:Есть два макроса,
EXIT_SUCCESS
иEXIT_FAILURE
, определенные в<cstdlib>
этом, также могут быть возвращены из,main()
чтобы указать успех и неудачу, соответственно.Возвращаемое значение
main()
передается вexit()
функцию, которая завершает программу.Обратите внимание, что все это применимо только при компиляции для размещенной среды (неофициально, среды, в которой у вас есть полная стандартная библиотека и есть ОС, выполняющая вашу программу). Также возможно скомпилировать программу на C ++ для автономной среды (например, некоторых типов встроенных систем), в этом случае запуск и завершение полностью определяются реализацией, и
main()
функция может даже не потребоваться. Если вы пишете C ++ для современной настольной ОС, вы компилируете для размещенной среды.источник
Main
должен быть статической функцией-членом, потому что он даже не имеет функций, не являющихся членами. Даже С89 требуетmain
вернутьint
. Я недостаточно знаком с K & R C, чтобы знать его точные правила, но я предполагаю, что он также требуетmain
возврата,int
посколькуmain
отсутствие типа возврата было довольно распространенным явлением и отсутствие типа = неявноеint
в K & R.int
.void
тип возвращаемого значения как расширение языка . Компиляторы, которые не разрешают это, включают GCC и Comeau.Из стандартных документов. 3.6.1.2 Основная функция ,
int main() { / ... / }
иint main(int argc, char* argv[]) { / ... / }
Надеюсь, это поможет..
источник
main
должен быть возвращаемый типint
?void
ломать эту модель. Это даже не имеет смысла, если бы вы имели в виду «всегда считаю успехом». Потому что вы не могли сказать, действительно ли процесс провалился, так ли вы действительно преуспели? Нет, вернисьint
.Точная формулировка последнего опубликованного стандарта (C ++ 14):
Это дает понять, что альтернативные варианты написания разрешены, если тип
main
является типомint()
илиint(int, char**)
. Таким образом, следующие также разрешены:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
источник
int main(void)
она не верна в C ++.auto main() -> int
не имеет выведенного типа возврата. Обратите внимание на {в "(auto main () {... не разрешено)" и, пожалуйста, научитесь знать, когда вы еще не знаете достаточно, чтобы добавить что-то значимое.Две действительные сети являются
int main()
иint main(int, char*[])
. Любая вещь может компилироваться или не компилироваться. Еслиmain
явно не возвращает значение, 0 неявно возвращается.источник
main
void. Есть ли конкретная причина, по которой тип возвращаемого значения main должен быть int?int
типа возврата,main
является то, что это значение передается оболочке как код завершения программы иsh
ожидает значениеint
.void
они все молчат. С помощьюint
мы должны определить конкретное значение выхода для каждого возврата изmain
.Подробности о возвращаемых значениях и их значении
Согласно 3.6.1 (
[basic.start.main]
):Поведение
std::exit
подробно описано в разделе 18.5 ([support.start.term]
) и описывает код состояния:источник