Является ли main () перегруженным в C++?
2 допустимые версии на C++
:
int main() // version 1
int main(int argc, char **argv) // version 2
но обе перегрузки не могут сосуществовать одновременно. Почему бы и нет? (Потенциальный вариант использования: при запуске программы с терминала, если аргументы не передаются первая версия вызывается, в противном случае вторая версия.)
выполняет ли компилятор специальную проверку, чтобы разрешить только одну версию на двоичный файл?
6 ответов:
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(...)
стандарт говорит, что никакие аргументы и два аргумента указателя не в порядке. Однако, если реализация хочет предоставить больше аргументов, реализация может это сделать.
причина, по которой вы не можете иметь два
main
s-это та же причина, по которой вы не можете определить aprintf
как функция дважды в программе C. Конечно,printf
поддерживает различных доводов и изменения его поведения в зависимости от того, какие аргументы есть, но это не перегрузка в C++ смысле этого слова.
стандарт говорит, что
main
не может быть перегружен. Он не искажен, и у вас не может быть двух функций с одним и тем же незамутненным именем. Это вызовет сбой связывания, я думаю, но компилятор может захотеть добавить явные проверки, чтобы дать более четкие сообщения об ошибках.
int main(int argc, char **argv)
иint main()
должны быть предпочтительными сигнатурами для него, но компиляторы могут свободно приниматьmain
с разными параметрами.