主要在命名空间

shu*_*e87 31 c++ namespaces

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

namespace somenamespace{

int main(void){
 return 0;
}

}
Run Code Online (Sandbox Code Playgroud)

Chu*_*dad 49

3.6.1/1 - " 程序应包含一个名为main的全局函数,它是程序的指定开始.它是实现定义的,是否需要独立环境中的程序来定义主函数.[注意:in一个独立的环境,启动和终止是实现定义的;启动包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行;终止包含具有静态存储持续时间的对象的析构函数的执行.-end note]

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


Omn*_*ous 26

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

@Chubsdad已经指出了标准中的相关语言.但是这个标准现在写成了一个奇怪的"标准",与法律术语有很多相似之处.我觉得一个简单的英语陈述,说明发生了什么可能会更好.

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

  • 除了法律律师做了大量的复制粘贴和模糊的引用...标准往往表达一些新鲜的想法,标准是非常自足的. (2认同)
  • 我同意这个答案.不要引用标准,除非它是语言的一个不起眼的区域,他们特别要求它,或者你需要支持你的声明.这很烦人. (2认同)
  • 公平地说:Chubsdad引用了很长的一段。但是,“程序应包含一个名为`main`(3.6.1 / 1)的全局函数”会是不合理的响应吗?一句话,九个简单的单词。但是您仍在使用“标准语言”。 (2认同)