2009-12-16 108 views
6

在两个C++标准1998年和2003版本的部分3.6.1.2,C++标准禁止void main()原型吗?

的实现不应预先定义的主要功能。该功能不得超载。它应该有一个返回类型为int的类型,否则它的类型是实现定义的。

我不是英语为母语的人。我不确定“其他”的含义是什么。无论是禁止其他返回类型,还是赋予C++编译器编写者权利?

那么答案是什么?

回答

12

你引用不禁止宣称main返回void的英语。它允许参数变化,而不是返回类型。

+0

这是人们喜爱的项目捕捉参与者在新闻组。但是,可以将'main'的返回类型转换为'void'吗? – 2009-12-16 19:11:46

+0

对不起,我没有按照你的问题。你会在哪里接受主要的回报类型? – bmargulies 2009-12-16 19:28:52

+0

@bmargulies:在另一个将第一个程序的结果作为输入的C程序中?仍然是一个奇怪的问题。 – 2009-12-16 19:48:29

7

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

它应具有 int类型的返回类型,但除此之外,它的类型是 实现定义。

这意味着它可能看起来像这样:

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

等等,等等

2

该类型包含的不仅仅是返回类型。因此,返回类型必须是int,但是你可以自由考虑剩余的说法,即你可以,例如,选择

之间
int main() 

int main(int argc, char **argv) 
+0

或int main(int argc,char ** argv,char ** env)on linux – 2009-12-16 16:12:42

+0

不需要C++标准 – 2009-12-16 16:14:33

+0

但是可能是编译器的一个要求。 – 2009-12-16 16:35:36

0

至于参数的关注,它允许

  1. INT主()

  2. INT主(INT的argc,字符* argv的[])

  3. INT主(INT的argc,字符* argv的[],字符* envr [])

但是按照标准返回类型应该是INT一致性目的。

+0

3号不是C++标准所要求的。 – 2009-12-16 16:14:00

+0

第三个是C++标准允许但不要求的,以及无限多的其他可能的签名。第一个和第二个必须由符合的编译器允许。 – 2009-12-16 16:44:48

+0

公平地说,这个标准允许主要参数超出前两个参数的任何参数集,但访问任何更多的参数将是实现定义的行为(如果实现定义它们)或未定义的行为(如果它不?) – supercat 2010-09-30 14:53:40

0

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

int main(int fred, char *bouncy); 

,但不是这一个:

void main(int fred, char *bouncy); 

它的返回类型必须int,但执行允许有不同的说法类型。

1

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

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

Wikipedia

在C和C++,主要功能的功能原型看起来如下之一:

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

参数argc那样,参数计数,并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和达尔文有一个包含第四个参数任意OS提供的信息,如路径到执行二进制:

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