【问题标题】:Can we overload main() function in C++? [duplicate]我们可以在 C++ 中重载 main() 函数吗? [复制]
【发布时间】:2011-07-14 00:29:38
【问题描述】:

既然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**)”的声明与
冲突 prog.cpp:4:错误:此处的先前声明“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 的重载?如果有,是哪一种说法?

【问题讨论】:

    标签: c++ overloading main standards


    【解决方案1】:

    是的,它明确禁止这样做。参考3.6.1p2

    实现不应预定义主要功能。该功能不得重载。


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

    实现还允许为main 函数定义额外的有效参数列表(例如,POSIX 规范为环境变量指定了char **env 参数)。 main 的重载何时是“非主函数”或者它是否是“主函数”(因此是入口点)尚不清楚。据推测,如果您要声明多个入口点,您会希望得到一个错误,因此这些问题很重要。

    【讨论】:

    • 你对此有引用吗?
    • @bdonlan: www-d0.fnal.gov/~dladams/cxx_standard.pdf 例如(ISO/IEC 14882:1998(E))
    • 懒我。我应该在标准本身中查找。 +1。
    • 你能澄清一下你对 POSIX 的看法吗?你是说它允许 main 的第三个参数?我查看了exec 的规范,其中提到了一个特殊的extern char** environ 作为变量。
    【解决方案2】:

    您所做的是声明程序执行的两个入口点。这是编译器禁止的,因为当您运行程序时,程序将不知道从哪里开始!

    我也看不出您为什么要在应用程序设计中这样做。

    【讨论】:

    • 嗯,可以想象这样一个系统将如何工作。该程序将首先调用适当形式的唯一main()。所以它会选择int main(int argc, char *argv[]) 形式之一。显然这不会发生,但不难想象它会发生,如果它是可取的。
    【解决方案3】:

    据我说全局主函数(所有类之外的主函数)不能在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不能重载会产生编译时错误,这是因为你不能像上面所说的那样对同一个程序有多个入口点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-04
      • 2014-01-29
      • 1970-01-01
      • 2012-11-12
      • 2015-08-15
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多