Можем ли мы перегрузить функцию main() в С++?

Так как С+++ допускает перегрузку функции, можем ли мы перегрузить 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: ошибка: первый аргумент 'int main (const std::string &) должен быть' int
prog.cpp: 4: error: 'int main (const std::string &) принимает только нулевые или два аргумента
prog.cpp: В функции 'int main (int, char **):
prog.cpp: 8: ошибка: объявление функции C "int main (int, char **) конфликтует с
prog.cpp: 4: error: предыдущее объявление 'int main (const std::string &) здесь
prog.cpp: В функции 'int main (int, char **):
prog.cpp: 10: ошибка: неверное преобразование из 'const char * to' int
prog.cpp: 8: ошибка: слишком мало аргументов для функции 'int main (int, char **)
prog.cpp: 10: ошибка: на данный момент в файле

Итак, мне интересно, запрещает ли С++-стандарт перегрузку main? Если да, то какое утверждение?

Ответ 1

Да, это явно запрещает это. См. 3.6.1p2

Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена.


Таким образом, основное имя функции может оставаться беспредметным. То есть библиотека выполнения может вызывать символ, имеющий фиксированное имя (например, main или _main), чтобы перейти к основной функции. Код библиотеки не должен зависеть от того, какой список параметров имеет функция main.

Реализация также позволяет определять дополнительные допустимые списки параметров для функции main (например, спецификация POSIX указывает параметр char **env для переменных среды). Было бы неясно, когда перегрузка main является "не основной функцией" или является ли она "основной функцией", таким образом, точкой входа. Предположительно, вы хотели бы получить сообщение об ошибке, если бы объявили более одной точки входа, поэтому такие проблемы важны.

Ответ 2

Что вы сделали, так это объявить две точки входа для выполнения программы. Это запрещено компилятором, так как при запуске программы программа не знает, с чего начать!

Я также не вижу причин, по которым вы хотели бы сделать это в своем проекте.

Ответ 3

В соответствии со мной глобальная основная функция (основная функция вне всех классов) не может перегружаться в С++,. Но если вы напишете главную функцию внутри класса, тогда она будет компилироваться, но она не будет обрабатываться как точка входа в программу например, следующий код не будет компилировать имя файла 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: error: предыдущее объявление '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;

}

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