C++ 名称空间中的main

C++ 名称空间中的main,c++,namespaces,C++,Namespaces,为什么不编译? 链接器找不到main,但为什么会这样 namespace somenamespace{ int main(void){ return 0; } } 3.6.1/1-“程序应包含名为main的全局函数,该函数 是指定的开始时间 程序。它是实现定义的 程序是否处于独立状态 需要环境来定义 主要功能。[注:在 独立式环境、启动和维护 终止定义为执行; 启动包含执行 命名空间对象的构造函数 具有静态存储时间的范围; 终止包含以下内容的执行: 具有静态属性的对象的析构函数 储存期限

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

namespace somenamespace{

int main(void){
 return 0;
}

}
3.6.1/1-“程序应包含名为main的全局函数,该函数 是指定的开始时间 程序。它是实现定义的 程序是否处于独立状态 需要环境来定义 主要功能。[注:在 独立式环境、启动和维护 终止定义为执行; 启动包含执行 命名空间对象的构造函数 具有静态存储时间的范围; 终止包含以下内容的执行: 具有静态属性的对象的析构函数 储存期限-结束注释]


您的示例具有“main”(用作程序入口点)作为命名空间函数,因此您的代码格式不正确。这并不意味着不能像您那样定义函数“main”。这只是意味着独立程序需要按照标准定义的签名定义“main”的全局命名空间范围。托管程序需要链接器安排程序的执行是从一个名为“main”的全局函数开始的。benig能够创建自己的名称空间的全部意义——正如您所做的那样——是为了避免将内容放在全局名称空间中,这样它们就不会被其他代码或链接器意外拾取。您明确地说“我正在调用此函数main,但这只有在
somenamespace
的上下文中才有意义-如果您不知道somenamespace,您将无法找到或使用它”


在实现方面,由于命名空间的原因,主符号的损坏名称已从预期名称更改,因此链接器无法找到所需的符号表项。

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

是的。但现在《标准》是用一种奇怪的“标准语”写成的,这种语言与法律术语有很多相似之处。我觉得用一种简单的英语来描述正在发生的事情可能会更好


注意:标准是这样写的是有原因的。在标准中,你希望你使用的每一个术语都有一个非常精确和定义明确的含义,你不希望这个含义因上下文的不同而有所不同,因为它使标准更难解释。这实际上与法律术语看起来的原因非常相似是的。

除了法律律师做大量的复制粘贴和模糊引用之外……standardese倾向于表达一些新鲜的想法,而且标准本身也非常完备。我同意这个答案。不要引用标准,除非它是语言中一个模糊的领域,他们特别要求它,或者你需要支持你的主张。“这会让人厌烦的。@Potatoswatter-是的,这是真的。法律术语IMHO实际上很难解释,因为它隐含着100多年的法律历史。正如你所说的,这个标准是相当独立的。它有一些章节,其中对它使用的所有精确术语都进行了仔细的定义。公平地说:Chubsdad引用了一段很长的se但是“一个程序应该包含一个名为
main
(3.6.1/1)的全局函数”是一个不合理的回答吗?一句话,9个简单的单词。但是你仍然在使用“standardese”“@MSalters-是。但是,仅仅因为您可以引用标准的一部分并使其可读,并不意味着该标准总体上是对一般编程问题的一个很好的回答。