c ++标准禁止void main()原型吗?

时间:2009-12-16 16:06:17

标签: c++ standards main

在C ++ Standard 1998和2003版本的第3.6.1.2节中,

  

实现不应预定义主函数。此功能不应过载。它应该   返回类型为int类型,但其类型为实现定义。

我不是母语为英语的人。我不确定“但是否则”是什么意思。是否禁止其他返回类型,或赋予C ++编译器编写者权利?

那么答案是什么?

6 个答案:

答案 0 :(得分:12)

您引用的英语禁止​​声明main返回void。它允许参数的变化,而不是返回类型。

答案 1 :(得分:7)

Aaargh!是的,它确实。标准允许的唯一返回类型是int。引用第3.6.1节:

  

它应具有返回类型   int,但其他类型是   实现定义的。

意思是它看起来像这样:

int main( float f );
int main( int x, int y );

等。等

答案 2 :(得分:2)

该类型不仅包含返回类型。因此,返回类型必须是int,但考虑到剩下的参数,你可以自由,即你可以选择

int main()

int main(int argc, char **argv)

答案 3 :(得分:1)

标准是说返回类型必须是int,但该类型的其余部分取决于实现。例如,您可以使用符合标准(但不是非常有用)的C ++编译器。

int main(int secondsSinceSystemStart, int myFavoriteNumber, char* aFunnyJoke)

来自Wikipedia

  

在C和C ++中,main函数的函数原型看起来像下列之一:

int main(void)
int main(int argc, char **argv)
     

参数argc,参数count和argv,参数vector分别给出程序命令行参数的数量和值。 argc和argv的名称可以是任何有效的标识符,但使用这些名称是常见的惯例。 C和C ++标准也允许其他依赖于平台的格式;例如,Unix(虽然不是POSIX.1)和Microsoft Visual C ++有第三个参数给出程序的环境,否则可以通过stdlib.h中的getenv访问:

int main(int argc, char **argv, char **envp)
     

Mac OS X和Darwin的第四个参数包含任意OS提供的信息,例如执行二进制文件的路径:

int main(int argc, char **argv, char **envp, char **apple)

答案 4 :(得分:0)

就参数而言,它允许

  1. int main()

  2. int main(int argc,char * argv [])

  3. int main(int argc,char * argv [],char * envr [])

  4. 但是,为了保持一致性,标准返回类型应该是 int

答案 5 :(得分:0)

意图是除了返回类型之外的main函数类型的各个方面是实现定义的。这意味着该标准的该条款允许此声明:

int main(int fred, char *bouncy);

但不是这一个:

void main(int fred, char *bouncy);

它的返回类型必须int,但允许实现具有不同的参数类型。