6

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

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

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

那么答案是什么?

4

6 回答 6

12

你引用的英文确实禁止宣布main退货void。它允许传入的参数发生变化,但不允许返回类型发生变化。

于 2009-12-16T16:10:16.927 回答
7

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

它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。

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

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

等等等等

于 2009-12-16T16:09:27.670 回答
2

该类型不仅包含返回类型。因此,返回类型必须是 int,但您可以自由考虑剩余的参数,例如,您可以在

int main()

int main(int argc, char **argv)
于 2009-12-16T16:10:41.350 回答
1

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

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

来自维基百科

在 C 和 C++ 中,主函数的函数原型如下所示:

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

参数 argc(参数计数)和 argv(参数向量)分别给出程序命令行参数的数量和值。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 有第四个参数,其中包含操作系统提供的任意信息,例如执行二进制文件的路径:

int main(int argc, char **argv, char **envp, char **apple)
于 2009-12-16T16:17:55.313 回答
0

就参数而言,它允许

  1. 主函数()

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

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

但根据标准返回类型应为int以保持一致性。

于 2009-12-16T16:12:38.340 回答
0

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

int main(int fred, char *bouncy);

但不是这个:

void main(int fred, char *bouncy);

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

于 2009-12-16T16:14:02.547 回答