3

A. 以下尝试定义 C++ 独立程序的入口点“main”是否有效?

namespace{
 extern int main(){return 0;}
}

据我了解,它满足 C++ 标准中关于“main”的所有标准(外部链接,由于隐式 using 指令而在全局命名空间中可用)。

那么这个程序格式不正确,为什么?有没有参考标准?

B. 我已经对 EXIT_FAILURE 和 EXIT_SUCCESS 进行了讨论,但无法得出 EXIT_SUCCESS 是否应该始终为 0 的结论。这是因为根据标准,在“main”中省略 return 语句相当于返回 0。所以我想,EXIT_SUCCESS 应该始终为 0。

$18.3 - “如果状态为零或 EXIT_SUCCESS,则返回状态成功终止的实现定义形式。”

4

3 回答 3

2

这里namespace { }是一个匿名命名空间——想法是没有任何东西应该从那里逃逸到全局命名空间中——实际上,它都应该以不会与其他翻译单元冲突的东西作为前缀。你已经成功了extern,但没有extern "C",所以关于 main 不被破坏的特殊规则不会保护它,并且符号不会满足链接要求。无论如何,将一些 extern 放在匿名命名空间中只是一种混乱的想法。您始终不遗余力地查看如何将标准扭曲成奇怪的扭曲:-)。很好奇 - 有什么原因吗?你是在学术上对此感兴趣,还是对编译器或编译器测试套件或其他东西感兴趣?

看到您在问题中添加了关于 EXIT_SUCCESS 和 EXIT_FAILURE 的讨论。这里的关键点是您可以从 main 或 exit() 使用它们,并且知道它们可以在任何操作系统上运行。对于返回 0,无论您使用 EXIT_SUCCESS、0 还是让 main “失败”都不是问题。操作系统实际上可能会或可能不会将 0 返回给操作系统……可能是运行时将其映射到其他值,这意味着该操作系统上的“成功”。但是,对于失败 - 如果您返回任意非 0 值,它可能会绕过该映射,并指示与简单失败不同的内容或恰好与成功值一致。在不同的操作系统上也可以对值进行不同的处理:许多(例如 Linux)会去除除 8 个最低有效位之外的所有返回值,

于 2010-09-08T02:52:14.650 回答
1

A. 以下尝试定义 C++ 独立程序的入口点“main”是否有效?

不,C++ 标准说“程序应包含一个名为main”(第 3.6.1/1 节)的全局函数。在您的程序中,该main函数不在全局命名空间中;它位于一个未命名的命名空间中。

隐式 using 指令只允许在封闭的命名空间中查找和使用来自未命名命名空间的名称;它不会将这些名称添加到封闭的命名空间中。具体来说,“使用指令不会将任何成员添加到它出现的声明性区域”(第 7.3.4/1 节)。

这个程序格式不正确,为什么?

该程序不一定是格式错误的。没有规则禁止main在全局命名空间以外的命名空间中命名函数;这样的 功能只是不是main功能。 namespace { int main(); }int main()是两个不同的功能,一个格式良好的程序可以同时拥有这两个功能。

请注意,如果您的程序在全局命名空间中没有main函数,则该程序格式错误(因为如上所述,托管环境中的程序必须具有 main 函数)。

B. 我已经讨论过EXIT_FAILUREEXIT_SUCCESS但无法得出结论是否EXIT_SUCCESS应该始终如此0

没有要求EXIT_SUCCESS扩展到0. C标准简单地说,<stdlib.h>

定义的宏是......EXIT_FAILURE并且EXIT_SUCCESS扩展为整数常量表达式,可用作exit函数的参数,以分别将不成功或成功的终止状态返回给主机环境(C99 §7.20/3)。

(由于这两个宏在 中定义<cstdlib>,C 标准包含它们的规范)。

于 2010-09-08T04:14:07.550 回答
0

A. 当我尝试在 Visual C++ 2010 中运行您的代码时,我得到以下信息:

错误 1 ​​错误 LNK1561:必须定义入口点

在 C++ 中,main 必须在全局命名空间(即 ::main)中,并且不能是(类或实例)成员函数,尽管名称不是保留的,并且可以用于其他(普通)成员函数或非成员函数职能。

退出状态

从 main 函数返回的值成为进程的退出状态,尽管 C 标准仅将特定含义赋予两个值:EXIT_SUCCESS(传统上为零)和 EXIT_FAILURE。其他可能的返回值的含义是实现定义的。

更多关于它的信息

于 2010-09-08T02:51:39.843 回答