代码之家  ›  专栏  ›  技术社区  ›  shuttle87 Bhargav Boda

命名空间中的主

  •  28
  • shuttle87 Bhargav Boda  · 技术社区  · 14 年前

    为什么不编译呢? 链接器找不到main,但为什么会出现这种情况?

    namespace somenamespace{
    
    int main(void){
     return 0;
    }
    
    }
    
    3 回复  |  直到 14 年前
        1
  •  50
  •   Chubsdad    14 年前

    3.6.1/1- 程序应包含一个名为main的全局函数 ,其中 是指定的 程序。它是由实现定义的 一个独立的程序 需要环境来定义 独立环境、启动和 终止是实现定义的; 启动包含执行 命名空间对象的构造函数 终止包含执行 静态对象的析构函数

    您的示例将“main”(打算用作程序入口点)作为命名空间函数,因此您的代码格式不正确。这并不意味着函数“main”不能像您那样定义。它只是意味着对于 托管程序

        2
  •  28
  •   Community gkalpak    7 年前

    ::main ,不是 ::somenamespace::main . 这个 main 在程序启动时调用的必须在全局命名空间中。

    @Chubsdad pointed you at the relevant language in the standard that states this

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

        3
  •  4
  •   Tony Delroy    14 年前

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

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