2010-10-18 71 views
24

为什么不编译? 链接器找不到main,但为什么会出现这种情况?主要在命名空间

namespace somenamespace{ 

int main(void){ 
return 0; 
} 

} 

回答

42

3.6.1/1 - “计划须包含一个称为主全局函数,这 是 程序指定的开始,是实现定义是否在程序 。独立 环境需要以限定 主函数[注意:在一个 独立环境,启动和终止 是实现定义; 启动包含 构造对于n的对象的执行。 amespace 范围内有静态存储时间; 终止包含执行 对象的析构函数具有静态的 存储持续时间。 - 注意]

您的示例具有'main'(用作程序入口点)作为名称空间函数,因此您的代码格式不正确。这并不意味着函数'main'不能像你那样被定义。这意味着对于 独立程序,必须符合标准定义签名的全局名称空间范围定义'main'。 托管的程序

+0

啊我明白了,谢谢! – shuttle87 2010-10-18 05:00:58

4

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

执行方面,由于名称空间的原因,主要符号的已损坏名称已从预期名称更改,所以链接器只是找不到它需要的符号表条目。

22

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

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

备注:这样写标准是有原因的。在标准中,你希望每一个术语都有一个非常精确和明确的含义,并且你不希望这个含义因上下文而异,因为它使标准更难解释。这实际上非常类似于法律术语看起来如此的原因。

+2

我同意这个答案。不要引用标准,除非它是语言的一个模糊区域,他们专门要求它,或者您需要支持您的声明。它变得很烦人。 – GManNickG 2010-10-18 05:21:28

+0

@Patatoswatter - 是的,的确如此。 Legalese,恕我直言,实际上是很难解释,因为它隐含依赖于数百年的法律历史。正如你所说,标准是非常独立的。它有几个部分,其中使用的所有精确术语都经过精心定义。 – Omnifarious 2010-10-18 05:27:22