主要有两个问题

时间:2010-09-08 02:44:13

标签: c++ namespaces main

一个。以下尝试是否有效定义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 - “如果status为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。”

3 个答案:

答案 0 :(得分:2)

在这里,namespace { }是一个匿名命名空间 - 这个想法是没有任何东西可以从那里逃到全局命名空间 - 实际上,它应该都以不会与其他翻译单元冲突的东西为前缀。您已将其设为extern,而不是extern "C",因此有关主要未被修复的特殊规则将无法保护它,并且该符号将无法满足链接要求。无论如何,将一些extern放在一个匿名命名空间里只是混乱思考。你一直在不遗余力地看看如何将标准扭曲成奇怪的扭曲:-)。好奇 - 有原因吗?您是否对此有兴趣,或者实现编译器或编译器测试套件或什么?

看到你在你的问题中添加了对EXIT_SUCCESS和EXIT_FAILURE的讨论。这里的关键点是你可以在main或exit()中使用它们,并且知道它们可以在任何操作系统上运行。对于返回0,无论你使用EXIT_SUCCESS,0还是让main“掉头”都不是问题。操作系统可能会或可能不会实际返回0到操作系统...可能是运行时映射到某个其他值,这意味着该操作系统上的“成功”。但是,对于失败 - 如果您返回任意非0值,它可能会绕过该映射,并指示与简单失败不同或恰好与成功值一致的内容。在不同的操作系统上也可以区别对待值:许多(例如Linux)将剥离除8个最低有效位之外的所有值的返回值,这样返回256相当于返回0.这就是为什么猜测不是一个好主意的原因。在合适的非0值。

答案 1 :(得分:1)

  

一个。以下尝试是否有效定义C ++独立程序的入口点'main'?

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

隐式using指令只允许查找未命名的命名空间中的名称并在封闭的命名空间中使用;它不会将这些名称添加到封闭的命名空间中。具体来说,“a using-directive 不会将任何成员添加到它出现的声明区域”(§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_FAILUREEXIT_SUCCESS,它们扩展为整数常量表达式,可用作exit函数的参数,以返回不成功或成功的终止状态,分别对主机环境(C99§7.20/ 3)。

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

答案 2 :(得分:0)

一个。当我尝试在Visual C ++ 2010中运行您的代码时,我得到了这个:

  

错误1错误LNK1561:入口点   一定是   定义

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

退出状态

  

从main返回的值   函数成为退出状态   这个过程,虽然是C标准   只对两个人赋予具体含义   值:EXIT_SUCCESS( 传统上   零 )和EXIT_FAILURE。的含义   其他可能的返回值是   实现定义的。

有关它的更多信息here