主(或入口点)函数可以实现为lambda吗?

时间:2011-10-21 15:07:34

标签: c++ lambda c++11 main

这是否在最近更新的标准下有效?

auto main = [](int argc, char* argv[]) -> int
{
    return 0;
};

我最好的猜测是,它取决于main()必须是一个函数,还是允许它是可调用的任何全局范围符号(())。

3 个答案:

答案 0 :(得分:14)

不,main必须是全局函数,不能是函数对象或其他任何东西。参见ISO / IEC 14882:2011§3.6.1主要功能。

  

程序应包含一个名为main的全局函数,它是程序的指定开始。

来自第2段

  

所有实现都应允许以下两个定义   主:

     

int main() { /* ... */ }

     

     

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

不要求实现允许任何其他定义。

答案 1 :(得分:7)

不,这就是原因:

  

[n3290: 3.6.1/1]: 程序应包含一个名为的全局函数   main ,这是程序的指定开始。它是   实现 - 定义一个独立环境中的程序   需要定义一个主函数。 [注意:独立式   环境,启动和终止是实现定义的;   startup包含对象的构造函数的执行   名称空间范围,具有静态存储持终止包含   为具有静态存储持续时间的对象执行析构函数。    -end note ]

Lambda不是函数,而是函数对象或函子:

  

[n3290: 5.1.2/3]: lambda-expression 的类型(这是   也就是闭包对象的类型)是一个唯一的,未命名的不愈合   类类型 - 称为闭包类型 - 其属性如下所述。 [..]

答案 2 :(得分:1)

main()必须是一个函数,因为它是从系统库中调用它的方式。它是POSIX.1标准的一部分,它管理C链接的工作方式

主链接必须是一个外部全局,它不能内联或静态,因为它是从libc中调用的,通常来自一个名为_start的函数。

作为一个例子,glibc中_start的典型实现是:

int _start() {
     __libc_init(argc, argv, __environ);
     exit(main(argc, argv, __environ));
}

各种libc实现都会以类似的方式实现。

在C ++中,main函数必须在全局范围内声明(即):: main();再次因为它是从类似init的函数调用的,例如_start for libc on * nix函数在执行之后......