【问题标题】:Function type of main()main() 的函数类型
【发布时间】:2014-12-11 09:13:38
【问题描述】:

main 是用户定义的函数还是内置函数?还是两者兼而有之?

如果我说 main 的声明是预定义的,而定义是用户定义的,我可以说它既是内置的又是用户定义的?

这里有一个讨论: Is main() a User-Defined Function?

但我无法理解他们的结论,或者更确切地说,我对答案不满意。我与上述关于无法调用 main 的链接的讨论不同。它可以被调用,但不应该被调用(如果这个概念是错误的,请纠正我!)。

【问题讨论】:

  • main如果写成递归或相互递归的函数就可以调用
  • main 未在任何地方预先声明。只是标准指定了它应该指定的类型签名。
  • @cup AFAIK, gcc 如果您尝试使 main() 递归,则会抛出警告消息。但是,MSVC 允许这样做。
  • 是的,你是对的。我就知道!
  • @cup:不在 C++ 中。你不能在 C++ 中调用 main

标签: c++ c


【解决方案1】:

C11 标准列出了两种环境:独立环境t,表示嵌入式系统或操作系统,以及托管环境,表示在操作系统。

5.1.2.1 独立环境

在独立的环境中(C 程序的执行可能需要 没有任何操作系统好处的地方),名称和类型 程序启动时调用的函数有多少是实现定义的。

换句话说,在独立环境中,启动时调用的函数可以被调用任何东西,并且具有任何形式。最常见的是void main (void)

从C11开始,关于托管环境的章节:

5.1.2.2.1 程序启动

程序启动时调用的函数名为main。这 实现没有声明这个函数的原型。

“实现”是指编译器,所以编译器没有声明这样的函数。这取决于用户(程序员)这样做。这可以以int main (void)int main(int argc, char *argv[]) 的形式或以编译器指定的任何实现定义的方式完成。无论如何,功能是由用户定义的。

C++ 更严格一些,它强制执行这两种形式中的任何一种,并且不允许任何实现定义的 main 版本。从 C++03 3.6.1 开始:

实现不应预定义主要功能。这个功能 不得超载。它应该有一个 int 类型的返回类型,但是 否则它的类型是实现定义的。所有实现 应允许以下两个 main 定义:

int main() { /* ... */ }

int main(int argc, char* argv[]) { /* ... */ }


关于是否可以调用 main:我认为 C 标准中没有任何东西可以阻止这一点,即使调用 main 没有任何意义。由于它没有原型,所以调用它的唯一方法是递归,这只是一件很愚蠢的事情,但很有可能。

在 C++ 中,C++03 及更高版本的标准明确禁止调用 main():

函数 main 不得在程序中使用(3.2)。这 main 的链接(3.5)是实现定义的。一个程序 将 main 声明为内联或静态格式不正确。

【讨论】:

  • C11 标准确实说“从对 main 函数的初始调用返回是 [...]”,这表明可以在 C 中调用它。
  • @philipxy 我相信 C 标准将 main 视为与任何其他函数一样,除了它没有原型并且它允许您跳过最后的 return 语句。 C++ 更严格,更理智。
  • 更新了一些对 C++03 的引用的答案。
  • 我也找不到在 C11 中调用它的问题。
【解决方案2】:

main 函数只是入口点的一个符号,主要是实现定义的。 C++ 标准只要求实现接受 2 个签名,int main()int main(int, char**)

C++ 标准确实规定函数main 不得在程序中使用,因此说它也可以递归调用是不正确的。

您也并不总是需要 main 函数,例如在编译库时您不会包含它。

但答案远比这简单得多。函数定义是您定义函数体的位置,对于 main(与任何函数一样),您在用户代码中定义。因此它是用户定义的。

值得注意的是,用户定义的函数有时用于引用库中的函数,这不是我听说过的关于 C++ 的东西,但其他语言将 UDF 称为用户提交的库。

【讨论】:

  • 该标准不要求(托管)实现接受这两种形式。它可以接受第一个和/或第二个,和/或完全由实现定义的东西。
  • 我想这取决于你对“标准”的意思......我提到了 C11,但这个问题也被标记为 C++。我认为 C++ 明确禁止 main() 被调用,而 C 没有。
  • @Lundin,我指的是我的 C++ 标准副本,它与 this onemain 匹配(第 3.6.2 节)。我已经修改了我的答案,以澄清我说的是 C++。
【解决方案3】:

我认为它是用户定义的。虽然方法的签名和命名必须遵循标准,但函数的实现是用户定义的。

这使得函数成为用户定义的函数。

据我所知,在 C 和 C++ 中也没有内置函数。有一些标准库添加了库函数。但这些功能并未内置于语言中。

【讨论】:

    【解决方案4】:

    在 C++ 中,标准 [第 3.6.1 节] 规定 main 应为入口点(独立环境除外。,稀有!),不应预定义,不能重载且不应被调用程序(即使是间接的也没有递归调用)。

    在 C 中,标准定义了对 main 的初始调用的概念,以定义 main 的返回值的用途。 [第 5.1.2.2.3 节]。没有明确的规则禁止递归调用main。它也没有预定义的原型,即使通常用零个或两个参数定义它。

    【讨论】:

      猜你喜欢
      • 2013-07-16
      • 2015-09-02
      • 1970-01-01
      • 2013-07-12
      • 2020-10-02
      • 1970-01-01
      • 2013-08-12
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多