Можем ли мы перегрузить функцию main () в C++? [дубликат]

этот вопрос уже есть ответ здесь:

поскольку 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 не может быть перегружен он будет генерировать ошибку времени компиляции, потому что вы не можете иметь несколько точек входа для той же программы, что и выше.