【发布时间】:2011-04-26 18:44:26
【问题描述】:
为什么不编译? 链接器找不到main,但是为什么会这样呢?
namespace somenamespace{
int main(void){
return 0;
}
}
【问题讨论】:
标签: c++ namespaces
为什么不编译? 链接器找不到main,但是为什么会这样呢?
namespace somenamespace{
int main(void){
return 0;
}
}
【问题讨论】:
标签: c++ namespaces
3.6.1/1 - "程序应包含一个名为 main 的全局函数,它 是指定的开始 程序。它是实现定义的 一个程序是否独立 环境需要定义一个 主功能。 [注:在一个 独立的环境,启动和 终止是实现定义的; 启动包含执行 命名空间对象的构造函数 具有静态存储持续时间的范围; 终止包含执行 静态对象的析构函数 储存期限。 ——尾注]
您的示例将“main”(用作程序入口点)作为命名空间函数,因此您的代码格式错误。这并不意味着不能像您那样定义函数“main”。这只是意味着独立程序需要根据标准定义的签名对“main”进行全局命名空间范围定义。托管程序
【讨论】:
链接器需要安排程序的执行在一个名为“main”的全局函数中开始。 benig 能够创建自己的命名空间的全部意义——就像你所做的那样——是避免将东西放在全局命名空间中,这样它们就不会被其他代码或链接器意外拾取。您明确地说“我正在调用此函数 main,但这仅在 somenamespace 的上下文中有意义 - 如果您不了解某些命名空间,您将无法找到或无法使用它”。
在实现方面,由于命名空间的原因,主符号的错位名称已从预期名称更改,因此链接器只是找不到它需要的符号表条目。
【讨论】:
链接器正在寻找::main,而不是::somenamespace::main。程序启动时调用的main 必须在全局命名空间中。
@Chubsdad 有 pointed you at the relevant language in the standard that states this。但是该标准现在是用一种奇怪的“标准语言”编写的,与法律语言有很多相似之处。我觉得用简单的英文说明正在发生的事情可能会更好。
注意:标准以这种方式编写是有原因的。在标准中,您希望使用的每个术语都具有非常精确和明确定义的含义,并且您不希望该含义因上下文而异,因为这使标准更难解释。这实际上与legalese看起来如此的原因非常相似。
【讨论】:
main (3.6.1/1) 的全局函数”会是不合理的回应吗?一句话,9个简单的单词。然而你仍在使用“标准”。