C++中的main()函数可以重载吗?

16

由于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:错误:‘int main(const std::string&)’的第一个参数应该是‘int’
prog.cpp:4:错误:‘int main(const std::string&)’仅接受零或两个参数
prog.cpp:在函数‘int main(int, char**)’中:
prog.cpp:8:错误:C函数声明‘int main(int,char **)’与先前的声明‘int main(const std::string&)’冲突
prog.cpp:在函数‘int main(int,char **)’中:
prog.cpp:10:错误:从‘const char*’到‘int’的转换无效
prog.cpp:8:错误:函数‘int main(int,char **)’的参数过少
prog.cpp:10:错误:在文件的此处

因此,我想知道C++标准是否明确禁止重载main函数?如果是,哪条语句?

3个回答

27

是的,这明确禁止了那个。请参阅3.6.1p2。

实现不得预定义main函数。此函数不得被重载。


这样,main函数的名称可以保持不变形。也就是说,运行时库可以调用一个具有固定名称(例如main_main)的符号以跳转到主函数。库的代码将不需要依赖于程序的main函数的参数列表。

实现还允许为main函数定义其他有效的参数列表(例如,POSIX规范指定了一个char **env参数来传递环境变量)。如果重载main函数是“非主函数”还是入口点“主函数”,则不清楚。因此,如果声明了多个入口点,则希望出现错误,因此此类问题很重要。


你有这个的引用吗? - bdonlan
1
@bdonlan: 例如http://www-d0.fnal.gov/~dladams/cxx_standard.pdf(ISO/IEC 14882:1998(E)) - schnaader
懒惰的我,本应该在标准中查找。+1。 - Nawaz
你能澄清一下你关于POSIX的说法吗?你是说它允许在main函数中有第三个参数吗?我查看了exec的规范,它提到了一个特殊的extern char** environ变量。 - NicholasM

0
你所做的是声明了程序执行的两个入口点。编译器禁止这样做,因为当你运行程序时,程序将不知道从哪里开始!我也看不出你想在应用程序设计中这样做的任何理由。

2
嗯,人们可以想象这样的系统如何工作。程序将通过调用适当形式的唯一 main() 开始运行。因此,它将选择形式之一 int main(int argc, char *argv[])。显然,这并没有发生,但如果需要的话,想象它可能并不太难。 - David Heffernan

-2

依我之见,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++中,全局的main函数不能被重载,否则会产生编译时错误,这是因为同一个程序不能有多个入口点,正如上面所说的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接