在许多c++ IDE和编译器中,当它为你生成main函数时,它看起来像这样:
int main(int argc, char *argv[])
当我在没有IDE的情况下编写c++代码时,只是使用命令行编译器,我键入:
int main()
没有任何参数。这意味着什么?它对我的程序至关重要吗?
在许多c++ IDE和编译器中,当它为你生成main函数时,它看起来像这样:
int main(int argc, char *argv[])
当我在没有IDE的情况下编写c++代码时,只是使用命令行编译器,我键入:
int main()
没有任何参数。这意味着什么?它对我的程序至关重要吗?
当前回答
假设你这样运行你的程序(使用sh语法):
myprog arg1 arg2 'arg 3'
如果你将main声明为int main(int argc, char *argv[]),那么(在大多数环境中),你的main()将像这样被调用:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
但是,如果将main声明为int main(),则它的名称将类似于
exit(main());
你不能让争论通过。
还有两件事需要注意:
这是main唯一的两个标准强制签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这就是一个扩展,在可移植程序中不应该依赖它。 *argv[]和**argv是完全等价的,所以你可以把int main(int argc, char *argv[])写成int main(int argc, char **argv)。
其他回答
假设你这样运行你的程序(使用sh语法):
myprog arg1 arg2 'arg 3'
如果你将main声明为int main(int argc, char *argv[]),那么(在大多数环境中),你的main()将像这样被调用:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
但是,如果将main声明为int main(),则它的名称将类似于
exit(main());
你不能让争论通过。
还有两件事需要注意:
这是main唯一的两个标准强制签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这就是一个扩展,在可移植程序中不应该依赖它。 *argv[]和**argv是完全等价的,所以你可以把int main(int argc, char *argv[])写成int main(int argc, char **argv)。
这两个
int main(int argc, char *argv[]);
int main();
是C或c++程序入口点的合法定义。Stroustrup: c++风格和技术常见问题解答详细介绍了一些主要函数可能或合法的变化。
main的参数表示程序启动时提供给程序的命令行参数。argc形参表示命令行参数的数量,char *argv[]是一个字符串数组(字符指针),表示命令行上提供的各个参数。
让我们考虑声明:
int main (int argc, char *argv[])
在上面的声明中,第二个名为argv的形参的类型实际上是一个char**。也就是说,argv是一个指向char类型指针的指针。这是因为由于类型衰减,char*[]衰减为char**。例如,下面给出的声明是等价的:
int main (int argc, char *argv[]); //first declaration
int main (int argc, char **argv); //RE-DECLARATION. Equivalent to the above declaration
换句话说,argv是指向char*类型元素数组的第一个元素的指针。此外,数组中的每个元素argv[i](包含char*类型的元素)本身指向一个字符,该字符是一个以空结尾的字符串的开始。也就是说,每个元素argv[i]指向一个包含char类型(而不是const char类型)元素的数组的第一个元素。为了说明目的,给出了一个图表:
正如在其他回答中已经说过的,当我们想要使用命令行参数时,使用这种形式的main声明。
当使用int和char**时,第一个参数将是调用程序的命令数量,第二个参数是所有这些命令