在 C++ 中递归到 main() 是否合法?

发布于 2024-10-08 22:03:18 字数 140 浏览 5 评论 0原文

我读到 C++ 标准禁止在 main() 中递归,但是 g++ 毫无怨言地编译了以下代码:

int main()
{
    main();
}

任何人都可以澄清这一点吗?

I read that the C++ standard forbids recursion in main(), but g++ compiles the following code without complaint:

int main()
{
    main();
}

Can anyone clarify this?

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

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

发布评论

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

评论(5

只为守护你 2024-10-15 22:03:18

根据3.6.1/3中的标准,它不是:

函数main 不得使用
(3.2) 在程序内

使用的定义是:

对象或非重载
如果函数的名称出现在可能评估的表达式中,则使用该函数。

According to the standard in 3.6.1/3, it's not :

The function main shall not be used
(3.2) within a program

The definition of used being :

An object or non-overloaded
function is used if its name appears in a potentially-evaluated expression.

奶茶白久 2024-10-15 22:03:18

我会做鱼并解释为什么这是禁止。在 C 或 C++ 程序开始运行之前,必须首先初始化 CRT。打开 stdin/out/err,调用初始值设定项,诸如此类的事情。有两种基本策略可以完成此任务,一个重要的平台实现细节。

  • 程序的起始地址指向CRT init函数,该函数最终调用main()。在具有精美加载程序的全功能操作系统上很常见,该加载程序可以支持可执行映像中的任意部分。

  • 编译器将代码注入到调用 CRT 初始化函数的 main() 函数中。启动函数始终是 main()。在加载程序功能有限的嵌入式平台上常见。递归 main() 现在是一个问题,CRT 启动代码将被再次调用,并且堆栈状态不可预测。

I'll do the fish and explain why this is verboten. Before a C or C++ program can start running, the CRT has to be initialized first. Open stdin/out/err, call initializers, that sort of thing. There are two basic strategies to get this done, a heavy platform implementation detail.

  • The program's start address points to the CRT init function, which eventually calls main(). Common on full-featured operating systems that have a fancy loader which can support arbitrary sections in the executable image.

  • The compiler injects code into the main() function that calls the CRT initialization function. The start function is always main(). Common on embedded platforms with limited loader capabilities. Recursing main() is now a problem, the CRT startup code will be called again with an unpredictable stack state.

沫尐诺 2024-10-15 22:03:18

此处的主张是,它确实是被明确禁止的:

嗯,标准规定:

3.6.1.3

“函数 main 不得在程序中使用。”

5.2.2.9

“允许递归调用,除了名为 main 的函数”

您当然可以这样做:(

int main(int argc, char* argv[]) {
    return foo(argc, argv);
}
int foo(int argc, char* argv[]) {
    if (some_condition) {
        return foo(argc, argv);
    }
    return 0;
}

注意我添加了一个 get-out 子句。我什至不能假设无限地编写代码递归,它在我身上重复。)

The claim here is that it is indeed specifically forbidden:

Well, the standard states:

3.6.1.3

"The function main shall not be used within a program."

5.2.2.9

"Recursive calls are permitted, except to the function named main"

You can, of course, do this:

int main(int argc, char* argv[]) {
    return foo(argc, argv);
}
int foo(int argc, char* argv[]) {
    if (some_condition) {
        return foo(argc, argv);
    }
    return 0;
}

(Note I added a get-out clause. I can't even hypothetically code infinite recursion, it repeats on me.)

司马昭之心 2024-10-15 22:03:18

这是不合法的。阅读 3.6.1-3 :

不得使用 main 函数
(3.2) 在程序内。联动性
(3.5)的主要是
实现定义的。一个程序
声明 main 为内联或静态
格式不正确。名字主要不是
否则保留。 [示例:会员
函数、类和枚举
可以称为 main,实体也可以称为 main
其他命名空间。 ]

It is not legal. Read 3.6.1-3 :

The function main shall not be used
(3.2) within a program. The linkage
(3.5) of main is
implementation-defined. A program that
declares main to be inline or static
is ill-formed. The name main is not
otherwise reserved. [Example: member
functions, classes, and enumerations
can be called main, as can entities in
other namespaces. ]

め可乐爱微笑 2024-10-15 22:03:18

其他人已经解决了标准部分。但是,我想指出,如果您使用 -pedantic-errors 并至少包含其中一个错误(取决于 main),g++(至少 4.6.2)将拒绝此错误代码>签名):

error: ISO C++ forbids calling ‘::main’ from within program [-pedantic]
error: ISO C++ forbids taking address of function ‘::main’ [-pedantic]

Other people have addressed the standards part. However, I'd like to note that g++ (at least 4.6.2) will reject this if you use -pedantic-errors with at least one of these errors (depending on main signature):

error: ISO C++ forbids calling ‘::main’ from within program [-pedantic]
error: ISO C++ forbids taking address of function ‘::main’ [-pedantic]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文