主要是用户定义的函数还是内置函数?还是两者兼而有之?
如果我说main的声明是预定义的并且定义是用户定义的,我可以说它是内置的和用户定义的吗?
这里有一个讨论: Is main() a User-Defined Function?
但我无法理解他们的结论,或者更确切地说,我对答案并不满意。我不同于上面关于那个主要不能被调用的链接的讨论。它可以被调用,但是应该被调用(如果这个概念错了,请纠正我!)。
答案 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
进行递归调用。即使通常使用零或两个参数定义它,也没有预定义的原型。