Можем ли мы перегрузить функцию main () в C++? [дубликат]
этот вопрос уже есть ответ здесь:
- является ли main () перегруженным в C++? 6 ответов
поскольку C + + + позволяет перегрузку функции, можем ли мы перегрузить main()
?
например,
int main(const std::string &)
{
return 0;
}
int main(int argc, char *argv[])
{
return main("calling overloaded main");
}
gcc-4.3.4
не компилирует это и дает следующие ошибки: (см. В ideone)
prog.cpp: 4: error: первый аргумент 'int main(const std:: string&) ‘должен быть’int'
еда.cpp: 4: error: 'int main(const std:: string&)' принимает только ноль или два аргумента
еда.cpp: в функции ' int main (int, char**)’:
еда.cpp: 8: Ошибка: объявление функции C "int main(int, char**)" конфликтует с
еда.cpp: 4: ошибка: предыдущее объявление "int main (const std::string&)" здесь
еда.ЧГК: в функция ' int main (int, char**)’:
еда.cpp: 10: ошибка: недопустимое преобразование из 'const char* ' в’int'
еда.cpp: 8: Ошибка: слишком мало аргументов для функции ' int main (int, char**)’
еда.от cpp:10: ошибка: на данный момент в файле
поэтому мне интересно, если стандарт C++явно запрещает перегрузку main
? Если да, то какое заявление?
3 ответов
Да, это явно запрещает. Обратитесь к 3.6.1п2
реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена.
таким образом, имя главной функции может остаться unmangled. То есть библиотека времени выполнения может вызывать символ с фиксированным именем (e.g main
или _main
), чтобы перейти к основной функции. Код библиотек не должен зависеть от того, какой список параметров программы имеет.
реализация также позволяет определить дополнительные допустимые списки параметров для main
функция (спецификация POSIX указывает char **env
параметр для переменных среды, например). Было бы непонятно, когда перегрузка main
является " неосновной функцией "или является ли это" основной функцией", таким образом, точкой входа. Предположительно, вы захотите получить ошибку, если объявите более одной точки входа, поэтому такие проблемы важны.
Что вы сделали-это объявить две точки входа для выполнения программы. Это запрещено компилятором, так как при запуске программы программа не будет знать, с чего начать!
Я также не вижу причин, по которым вы хотели бы сделать это в дизайне вашего приложения.
согласно мне глобальная основная функция (основная функция вне всех классов) не может быть перегружена в c++, но если вы пишете основную функцию внутри класса, то она будет компилироваться нормально, однако она не будет рассматриваться как точка входа программы например, следующий код не будет компилировать имя файла mainoverloaderror.cpp
#include<iostream>
using namespace std;
int main(int noofarg,char *values[])
{
std::cout<<"hello "<<endl<<values[0]<<endl<<values[1]<<endl<<noofarg;
return 0;
}
int main()
{
std::cout<<"hello main()";
return 0;
}
ошибка компиляции : mainoverloaderror.cpp: в функции ' int main ()’: mainoverloaderror.cpp: 13: ошибка: объявление функции C ' int main ()’ конфликты с mainoverloaderror.cpp: 7: ошибка: предыдущее объявление "int main (int, char**)" здесь
посмотрите на эту основную функцию кода внутри класса. Хотя он не будет иметь несколько точек входа, но будет компилироваться нормально:
#include<iostream>
using namespace std;
class MainClass{
int main1()
{
std::cout<<"hello main()"<<endl;
return 0;
}
int main(int noofarg,char *values[])
{
std::cout<<"hello "<<endl<<values[0]<<endl<<values[1]<<endl<<noofarg;
return 0;
}
int main()
{
std::cout<<"hello main()";
return 0;
}
};
int main()
{
std::cout<<"hello main()";
return 0;
}
таким образом, заключение: в C++ global main не может быть перегружен он будет генерировать ошибку времени компиляции, потому что вы не можете иметь несколько точек входа для той же программы, что и выше.