【问题标题】:Is main() a User-Defined Function? [duplicate]main() 是用户定义的函数吗? [复制]
【发布时间】:2011-06-09 16:23:06
【问题描述】:

毕竟,程序员确实定义了main()内部发生的事情。

那么,它应该被认为是用户定义的函数吗?

【问题讨论】:

  • 如果是user-defined function,那么我应该可以调用它。那么,您可以在代码中自己调用main() 吗?
  • @Mahesh 库函数不能这么说吗?
  • @Fritschy 我从来不知道用户可以调用 main 并且只是认为它是程序执行的入口程序。刚刚试了一下 - warning C4717: 'main' : recursive on all control paths, function will cause runtime stack overflow,谢谢你的信息。
  • @Fritschy:这里的 C 标准有什么相关性?
  • @Fritschy, @Mahesh:不,你不能打电话给main。参见 C++03 中的 3.6.1。

标签: c++ user-defined-functions main


【解决方案1】:

C++ 标准没有用户定义函数的概念。相反,它具有库函数的概念。 main 不是库函数。但是,该标准还对其签名提出了一些要求,并且不得重载或声明为静态或内联。特别是,它不能使用,这意味着你不能调用它。

编辑:我最初只检查了 C 标准。我现在也检查了 C++ 标准,它在以下上下文中使用“用户定义”:运算符、类型、转换和库。它还具有用户声明的命名空间、用户声明的(默认和复制)构造函数和用户编写的默认构造函数。它在 27.1.1 中确实具有“用户功能”。

【讨论】:

  • 适用于 C 标准。现在,让我们回答这个问题,它指的是 C++。
  • [假设您的意思是 C++。] 或静态。有一堆要求; 03 年的 3.6.1 全部列出。
  • @DeadMG:我错过了;我现在已经更新了 C++ 的答案。
  • 你不能打电话给main()?哪里说的?
  • 3.6.1p3:“函数 main 不得在程序中使用。”它继续说“main 的链接 (3.5) 是实现定义的。将 main 定义为已删除或将 main 声明为内联、静态或 constexpr 的程序格式不正确。”
【解决方案2】:

是的 - main 是用户定义的函数。考虑它的最简单方法是用户定义,但标准声明。

它还有其他限制,例如,非递归。但是,在 MSVC 等一些编译器上,它允许在 main() 中递归。我觉得这很方便。

【讨论】:

  • 我觉得这很方便。这很可怕,因为您的代码现在不符合要求。因此不是真正的 C++ 程序。
  • 我的代码的一致性问题比在 main 中递归要大得多。不合规不是一件值得害怕的事情,而是需要谨慎行使的事情,就像其他事情一样。
  • wtf???为什么要递归 main ???
  • @VJo 有很多原因。无需为此烦恼。
  • @Maxpm 你能说出一个吗?
【解决方案3】:

如果它不是用户定义的函数,它会是什么?显然不是内核或库函数?不知道我明白你在这里得到什么......

【讨论】:

    【解决方案4】:

    main 函数既不是内置(预定义)也不是用户定义的函数。这是一个例外,您必须遵循 C++ 标准中规定的相关要求(例如,关于它在程序中的存在、返回类型和参数)。

    【讨论】:

      【解决方案5】:

      main() 不是预定义或内置函数。它是具有预定义函数原型(也称为函数签名)的用户定义函数。用户编写它的功能,但它的声明有一定的限制。

      【讨论】:

      • “模板”这个词在 C++ 中有特定的含义,但不是这样。并且请不要使用诸如“u”之类的缩写来表示“you”;他们只是让事情变得更难阅读。
      【解决方案6】:

      main() 既不是用户定义的也不是内置的库函数。

      在尝试将 C 程序编译为可执行文件时,编译器会在您的源列表中查找名为 main 的函数。

      但是,创建一个库(作为共享对象或仅通过提供必要的头文件)具有不同的后果。

      您知道,GCC 会查找具有以下任一签名的 main

      int main(int, char **);

      int main();

      【讨论】:

        【解决方案7】:

        main() 是一个预定义的函数,代码从这里开始执行。如果你没有 main 函数,程序将不会运行。因此 main 是程序的起点。

        【讨论】:

        • 这是一个用户定义的函数,对其签名有一些限制。
        猜你喜欢
        • 2011-10-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 2015-09-09
        • 2022-11-02
        • 1970-01-01
        • 2011-01-30
        相关资源
        最近更新 更多