【发布时间】:2011-12-12 16:18:06
【问题描述】:
这在最近更新的标准下是否有效?
auto main = [](int argc, char* argv[]) -> int
{
return 0;
};
我的最佳猜测是它取决于 main() 是否必须是一个函数,或者是否允许它是任何可调用的全局范围符号(使用 ())。
【问题讨论】:
这在最近更新的标准下是否有效?
auto main = [](int argc, char* argv[]) -> int
{
return 0;
};
我的最佳猜测是它取决于 main() 是否必须是一个函数,或者是否允许它是任何可调用的全局范围符号(使用 ())。
【问题讨论】:
不,main 必须是全局函数,不能是函数对象或其他任何东西。请参阅 ISO/IEC 14882:2011 § 3.6.1 主要功能。
一个程序应包含一个名为 main 的全局函数,它是程序的指定开始。
从第 2 段开始
所有实现都应允许以下两种定义 主要:
int main() { /* ... */ }和
int main(int argc, char* argv[]) { /* ... */ }
实现不需要允许任何其他定义。
【讨论】:
不,原因如下:
[n3290: 3.6.1/1]:程序应包含一个名为的全局函数 main,这是程序的指定开始。它是 实现定义一个程序是否在一个独立的环境中 需要定义一个主函数。 [ 注意: 在一个独立的 环境、启动和终止是实现定义的; 启动包含执行对象的构造函数 具有静态存储持续时间的命名空间范围;终止包含 为具有静态存储持续时间的对象执行析构函数。 ——尾注 ]
Lambda 不是函数,而是函数对象或函子:
[n3290: 5.1.2/3]:lambda-expression 的类型(即 也是闭包对象的类型)是一个唯一的、未命名的非联合 类类型——称为闭包类型——其属性如下所述。 [..]
【讨论】:
main() 必须是一个函数,因为它是从系统库内部调用的方式。它是 POSIX.1 标准的一部分,管理着 C 链接的工作方式
主链接必须是外部全局的,不能内联或设为静态,因为它是从 libc 内部调用的,通常是从名为 _start 的函数调用的。
例如,glibc中_start的典型实现是:
int _start() {
__libc_init(argc, argv, __environ);
exit(main(argc, argv, __environ));
}
各种 libc 实现都会以类似的方式进行。
在 C++ 中,主函数必须在全局范围内声明(即)::main();再次因为它是从一个类似init的函数调用的,例如执行后在上面的*nix函数上的_start for libc......
【讨论】: