main()的函数类型

时间:2014-12-11 09:13:38

标签: c++ c

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

如果我说main的声明是预定义的并且定义是用户定义的,我可以说它是内置的和用户定义的吗?

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

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

4 个答案:

答案 0 :(得分:3)

C11标准列出了两种环境:独立环境 t,意味着嵌入式系统或操作系统,以及托管环境,意味着一个程序运行在一个OS。

  

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类型的返回类型,但是   否则其类型是实现定义的。所有实施   应允许以下两个主要定义:

     

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

     

     

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


关于是否可以调用主要内容:我不相信C标准中有任何内容阻止了这一点,即使调用main无论如何也是如此。由于它没有原型,所以调用它的唯一方法是递归,这只是一个简单的愚蠢的事情,但很有可能。

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

  

在程序中不得使用函数main(3.2)。该   main的链接(3.5)是实现定义的。一个程序   声明main为inline或static是不正确的。

答案 1 :(得分:2)

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

C ++标准确实说函数main不能在程序中使用,所以说它可以递归调用也不正确。

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

在C ++中,标准[第3.6.1节]说main应该是入口点(独立环境除外,rares!),不应该预定义,不能超载,并且应该不能在程序中调用(甚至没有间接的递归调用)。

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