为什么不编译? 链接器找不到main,但为什么会这样呢?
namespace somenamespace{
int main(void){
return 0;
}
}
答案 0 :(得分:47)
3.6.1 / 1 - “程序应包含一个名为main 的全局函数,其中 是指定的开始 程序。它是实现定义的 是一个独立的程序 环境需要定义一个 主功能。 [注意:在 独立环境,启动和 终止是实现定义的; startup包含执行 命名空间对象的构造函数 范围与静态存储持续时间; 终止包含执行 具有静态的对象的析构函数 储存期限。 - 后注]
您的示例将'main'(用作程序入口点)作为命名空间函数,因此您的代码格式错误。这并不意味着函数'main'不能像你那样定义。它只是意味着自由站点程序需要根据标准定义的签名定义'main'的全局命名空间范围。托管程序
答案 1 :(得分:23)
链接器正在寻找::main
,而不是::somenamespace::main
。在程序启动时调用的main
必须位于全局命名空间中。
@Chubsdad有pointed you at the relevant language in the standard that states this。但是这个标准现在写成了一个奇怪的“标准”,与法律术语有很多相似之处。我觉得一个简单的英语声明可能会更好。
注意:标准以这种方式编写是有原因的。在标准中,您希望您使用的每个术语具有非常精确和明确定义的含义,并且您不希望该含义根据上下文而变化,因为它使标准更难以解释。这实际上非常类似于法律术语看起来的方式。
答案 2 :(得分:4)
链接器需要安排程序的执行以一个名为“main”的全局函数开始。 benig能够创建自己的命名空间的全部意义 - 就像你所做的那样 - 是为了避免将东西放在全局命名空间中,这样它们就不会被其他代码或链接器意外地接收。你明确地说“我正在调用这个函数main,但这只在somenamespace
的上下文中有意义 - 如果你不知道somenamespace你将找不到或无法使用它。” / p>
实现方面,由于命名空间,主符号的错位名称已从预期名称更改,因此链接器只是找不到所需的符号表条目。