Является ли main () перегруженным в C++?


2 допустимые версии на C++:

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

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

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

6 67

6 ответов:

§3.6.1 / 2 (C++03) говорит

реализация не должна предопределять элемент

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/C++, насколько я могу судить, пока есть только один, что имеет смысл, так как ОС не знала бы, что вызывать, если бы их было больше одного. Проверка есть только один не делается в компиляторе, это делается в компоновщик.

3.6.1.2 в обоих выпусках стандарта C++ 1998 и 2003 годов говорится:

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

далее

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

раздел § 3.6.1 ¶ 2:

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

int main() { /* … */ }

и

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

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

Main была определена еще в C-дни. Это настройка больше по правилам printf. Рассмотрим main как varadic функции:

int main(...)

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

причина, по которой вы не можете иметь два mains-это та же причина, по которой вы не можете определить a printf как функция дважды в программе C. Конечно,printf поддерживает различных доводов и изменения его поведения в зависимости от того, какие аргументы есть, но это не перегрузка в C++ смысле этого слова.

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

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

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

error C2731: 'main' : function cannot be overloaded