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

发布于 2024-12-11 03:28:58 字数 196 浏览 1 评论 0原文

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

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

我最好的猜测是,这取决于 main() 是否必须是一个函数,或者是否允许它是任何可调用的全局作用域符号(使用 ())。

Is this valid under the recently updated standard?

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

My best guess is that it depends on whether main() MUST be a function, or if it is allowed to be any globally scoped symbol that is callable (with ()).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

莫言歌 2024-12-18 03:28:58

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

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

从第 2 段开始

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

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

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

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

No, main is required to be a global function and cannot be a function object or anything else. See ISO/IEC 14882:2011 § 3.6.1 Main Function.

A program shall contain a global function called main, which is the designated start of the program.

And from paragraph 2

All implementations shall allow both of the following definitions of
main:

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

and

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

There is no requirement for implementations to allow any other definitions.

甜`诱少女 2024-12-18 03:28:58

不,原因如下:

[n3290: 3.6.1/1]: 程序应包含一个名为
main
,这是程序的指定开始。这是
实现定义程序是否处于独立环境中
需要定义一个 main 函数。 [注意:在独立式
环境、启动和终止是实现定义的;
启动包含对象构造函数的执行
具有静态存储持续时间的命名空间范围;终止包含
执行具有静态存储持续时间的对象的析构函数。
—尾注]

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

[n3290: 5.1.2/3]: lambda 表达式 的类型(即
也是闭包对象的类型)是一个唯一的、未命名的非联合
类类型 - 称为闭包类型 - 其属性如下所述。 [..]

No, and here's why:

[n3290: 3.6.1/1]: A program shall contain a global function called
main
, which is the designated start of the program. It is
implementation-defined whether a program in a freestanding environment
is required to define a main function. [ Note: In a freestanding
environment, start-up and termination is implementation-defined;
startup contains the execution of constructors for objects of
namespace scope with static storage duration; termination contains the
execution of destructors for objects with static storage duration.
—end note ]

Lambdas are not functions, but function objects or functors:

[n3290: 5.1.2/3]: The type of the lambda-expression (which is
also the type of the closure object) is a unique, unnamed nonunion
class type — called the closure type — whose properties are described below. [..]

旧情别恋 2024-12-18 03:28:58

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 的函数调用的,例如上面 *nix 函数上 libc 的 _start 执行后调用...

main() must be a function because of the way it's called from within with the system libraries . It is part of the POSIX.1 standard and governs the way C linkage works

The main linkage has to be an extern global, it cannot be inlined or made static because it's called from within the libc and typically from a function called _start.

As an example, typical implementation of _start in glibc is:

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

Various libc implementations will do it in a similar fashion.

In C++ the main function must be declared in the global scope (i.e.) ::main(); again because it is called from an init-like function such as _start for libc on *nix function above after execution...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文