static main来自静态类?

时间:2010-09-18 16:44:44

标签: c++

我试图弄清楚为什么这不起作用。我想在Java中做,其中main是类中的静态函数,但这会产生未解析的外部符号错误:

 static class MainClass
{
     public:
    static int _tmain(int argc, char* argv[])
    {
        return 0;
    }
};

为什么这不起作用?

由于

7 个答案:

答案 0 :(得分:10)

C ++不能那样工作。
你需要main作为一个函数:

int main(int argc,char* argv[])
{
    //STUFF
}

答案 1 :(得分:6)

由于_tmain在其中包含类名MainClass的二进制文件中被破坏,因此多个类可能在其中包含函数_tmain而不会发生冲突。它没有像::_tmain那样具有相同的错位名称。

我记得在早期版本的MSVC中,它接受了以下内容而没有链接器错误,该错误由于我的代码库中的宏扩展而意外结束

namespace bar {
  int main() { }
}

它显然特别对待main这个名称,并没有将其破坏或与::main相同。但是这样的事情并不符合标准。就像在类的情况一样,这样的函数与主函数完全无关。

答案 2 :(得分:1)

从CRT调用

_tmain。您需要在链接器中设置另一个函数的入口点,该函数将调用MainClass :: _ tmain。

答案 3 :(得分:1)

因为在C ++中,你不能在一个类中放入一个入口点。 This answer可能有帮助。

答案 4 :(得分:1)

为什么不起作用?因为它不是C ++。

struct MainClass {
  static int main(int argc, char** argv) {
    return 0;
  }
};

int main(int argc, char** argv) {
  return MainClass::main(argc, argv);
}

答案 5 :(得分:0)

它不是真正的C ++,而是标准链接器进程正在寻找特定名称的导出(具有C风格的链接)。特定导出因编译器和可执行文件类型而异,但格式特定于每种类型。例如,Windows GUI exe具有与控制台不同的入口点,并且特定于ASCII或UNICODE。但是链接器总是在寻找具有特定链接名称的函数,这就是静态成员无法工作的原因。

答案 6 :(得分:0)

您始终需要将main()定义为全局函数。这是程序始终以C ++开头的地方。你可以简单地从main调用你的静态类函数,如果你真的想要传递变量:

class MainClass
{
     public:
    static int _tmain(int argc, char* argv[])
    {
        return 0;
    }
};

int main(int argc, char* argv[]) {
   return MainClass::_tmain(argc, argv);
}