Перегружен main() в С++?

В C++ существуют 2 допустимые версии main():

int main()  // version 1
int main(int argc, char **argv)  // version 2

Но обе перегрузки не могут сосуществовать одновременно. Почему нет? (Потенциальный прецедент: при запуске программы с терминала, если аргументы не переданы, вызывается первая версия, в противном случае вторая версия.)

Выполняет ли компилятор специальную проверку, чтобы разрешить только одну версию для двоичного кода?

Ответ 1

§ 3.3.1/2 (С++ 03) говорит

Реализация не должна предопределять main. Эта функция должна не перегружайтесь. Он должен иметь return type типа int, но в противном случае его тип определяется реализацией. Все реализации должны из следующих определений main:

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

Вы можете использовать любой из них. Оба стандарта являются стандартными.

Кроме того, поскольку char *argv[] эквивалентно char **argv, замена char *argv[] на char **argv не имеет никакого значения.


Но обе версии не могут сосуществовать одновременно! (пример использования может быть таким: во время запуска двоичного файла из командной строки, если вы не передадите аргумент, тогда 1-я версия должна быть названа иначе 2-й версией).

Нет. Обе версии не могут сосуществовать одновременно. Одна программа может иметь ровно одну функцию main. Какой из них зависит от вашего выбора. Если вы хотите обработать аргумент командной строки, вам нужно выбрать вторую версию, или же первой версии достаточно. Также обратите внимание, что если вы используете вторую версию и не передаете какой-либо аргумент командной строки, то в этом нет вреда. Это не вызовет никаких ошибок. Вам просто нужно интерпретировать argc и argv соответственно, и, основываясь на их значении, вы должны написать логику и поток вашей программы.

Ответ 2

В Windows и Unix есть:

int main(int argc, char **argv, char **envp)

и приложения Win32:

int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

и MacOS имеет:

int main(int argc, char **argv, char **envp, char **apple)

Не забывайте, что main обычно не является первым, что ОС вызывает при выполнении программы. Функция main - это функция, вызываемая средой времени выполнения. Адрес первой исполняемой команды обычно объявляется в некоторых метаданных, обычно в начале, если исполняемый файл.

Ничто из вышеперечисленного не противоречит стандарту C/С++, насколько я могу судить, если есть только одно, что имеет смысл, поскольку ОС не знает, что вызвать, если их было больше одного. Проверка того, что в компиляторе сделано только одно, выполняется в компоновщике.

Ответ 3

Раздел 3.6.1.2 обоих выпусков С++ Standard 1998 и 2003:

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь тип возвращаемого типа int, но в противном случае его тип определяется реализацией.

Далее

Стандарт ISO С++ (ISO/IEC 14882: 1998) специально требует, чтобы main возвращал int. У этого есть явное ограничение "должно" для хорошо сформированных программ.

Раздел § 3.6.1 ¶ 2:

Он должен иметь тип возврата int, но в противном случае его тип определяется реализацией. Все реализации должны допускать оба следующих определения main:

int main() { /* … */ }

и

int main(int argc, char* argv[]) { /* … */ }

Таким образом, обе версии main разрешены стандартом, и один из них остается в качестве предпочтения реализации программиста.

Ответ 4

Main был определен в дни C. Он настраивается по правилам printf. Рассмотрим main как функцию varadic:

int main(...)

В стандарте говорится, что никакие аргументы и два аргумента указателя в порядке. Однако, если реализация хочет предоставить больше аргументов, реализация будет бесплатной.

Причина, по которой вы не можете иметь два main, по той же причине, что вы не можете определить функцию printf, как правило, в программе на C. Несомненно, printf поддерживает разные аргументы и изменяет его поведение в зависимости от того, какие аргументы существуют, но это не перегрузка в смысле С++ термина.

Ответ 5

В стандарте указано, что main не может быть перегружен. Это не искалечено, и у вас не может быть двух функций с тем же самым неповрежденным именем. Это приведет к сбою связи, я думаю, но компилятор может захотеть добавить явные проверки, чтобы дать более ясные сообщения об ошибках.

int main(int argc, char **argv) и int main() должны быть предпочтительными сигнатурами для него, но компиляторы могут принимать main с разными параметрами.

Ответ 6

Невозможно перегрузить main() в С++, потому что. компилятор показал следующую ошибку:

error C2731: 'main' : function cannot be overloaded