【问题标题】:main in namespace命名空间中的主要内容
【发布时间】:2011-04-26 18:44:26
【问题描述】:

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

namespace somenamespace{

int main(void){
 return 0;
}

}

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

    3.6.1/1 - "程序应包含一个名为 main 的全局函数,它 是指定的开始 程序。它是实现定义的 一个程序是否独立 环境需要定义一个 主功能。 [注:在一个 独立的环境,启动和 终止是实现定义的; 启动包含执行 命名空间对象的构造函数 具有静态存储持续时间的范围; 终止包含执行 静态对象的析构函数 储存期限。 ——尾注]

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

    【讨论】:

      【解决方案2】:

      链接器需要安排程序的执行在一个名为“main”的全局函数中开始。 benig 能够创建自己的命名空间的全部意义——就像你所做的那样——是避免将东西放在全局命名空间中,这样它们就不会被其他代码或链接器意外拾取。您明确地说“我正在调用此函数 main,但这仅在 somenamespace 的上下文中有意义 - 如果您不了解某些命名空间,您将无法找到或无法使用它”。

      在实现方面,由于命名空间的原因,主符号的错位名称已从预期名称更改,因此链接器只是找不到它需要的符号表条目。

      【讨论】:

        【解决方案3】:

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

        @Chubsdadpointed you at the relevant language in the standard that states this。但是该标准现在是用一种奇怪的“标准语言”编写的,与法律语言有很多相似之处。我觉得用简单的英文说明正在发生的事情可能会更好。

        注意:标准以这种方式编写是有原因的。在标准中,您希望使用的每个术语都具有非常精确和明确定义的含义,并且您不希望该含义因上下文而异,因为这使标准更难解释。这实际上与legalese看起来如此的原因非常相似。

        【讨论】:

        • 除了法律律师做大量的复制粘贴和晦涩的引用……标准语言倾向于表达一些新鲜的想法,而且标准相当独立。
        • 我同意这个答案。不要引用标准,除非它是语言的一个晦涩领域,他们特别要求,或者你需要支持你的主张。它变得很烦人。
        • @Potatoswatter - 是的,这是真的。 Legalese,恕我直言,实际上更难解释,因为它隐含地依赖于 100 多年的法律历史。正如您所说,该标准非常独立。它的各个部分都仔细定义了它使用的所有精确术语。
        • 平心而论:Chubsdad 引用了很长的一段话。但是“程序应包含一个名为main (3.6.1/1) 的全局函数”会是不合理的回应吗?一句话,9个简单的单词。然而你仍在使用“标准”。
        • @MSalters - 是的。但仅仅因为您可以引用标准的一部分并使其具有可读性并不意味着该标准通常是一般编程问题的良好答案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        相关资源
        最近更新 更多