主要在命名空间

时间:2010-10-18 04:52:39

标签: c++ namespaces

为什么不编译? 链接器找不到main,但为什么会这样呢?

namespace somenamespace{

int main(void){
 return 0;
}

}

3 个答案:

答案 0 :(得分:47)

  

3.6.1 / 1 - “程序应包含一个名为main 的全局函数,其中   是指定的开始   程序。它是实现定义的   是一个独立的程序   环境需要定义一个   主功能。 [注意:在   独立环境,启动和   终止是实现定义的;   startup包含执行   命名空间对象的构造函数   范围与静态存储持续时间;   终止包含执行   具有静态的对象的析构函数   储存期限。 - 后注]

您的示例将'main'(用作程序入口点)作为命名空间函数,因此您的代码格式错误。这并不意味着函数'main'不能像你那样定义。它只是意味着自由站点程序需要根据标准定义的签名定义'main'的全局命名空间范围。托管程序

答案 1 :(得分:23)

链接器正在寻找::main,而不是::somenamespace::main。在程序启动时调用的main必须位于全局命名空间中。

@Chubsdadpointed you at the relevant language in the standard that states this。但是这个标准现在写成了一个奇怪的“标准”,与法律术语有很多相似之处。我觉得一个简单的英语声明可能会更好。

注意:标准以这种方式编写是有原因的。在标准中,您希望您使用的每个术语具有非常精确和明确定义的含义,并且您不希望该含义根据上下文而变化,因为它使标准更难以解释。这实际上非常类似于法律术语看起来的方式。

答案 2 :(得分:4)

链接器需要安排程序的执行以一个名为“main”的全局函数开始。 benig能够创建自己的命名空间的全部意义 - 就像你所做的那样 - 是为了避免将东西放在全局命名空间中,这样它们就不会被其他代码或链接器意外地接收。你明确地说“我正在调用这个函数main,但这只在somenamespace的上下文中有意义 - 如果你不知道somenamespace你将找不到或无法使用它。” / p>

实现方面,由于命名空间,主符号的错位名称已从预期名称更改,因此链接器只是找不到所需的符号表条目。

相关问题