在许多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()
没有任何参数。这意味着什么?它对我的程序至关重要吗?
当前回答
只是补充一下,因为有人说有第三个参数(*envp[]),这是真的,有,但不是POSIX安全,如果你想让你的程序使用环境变量,你应该使用extern char environ;D
其他回答
只是补充一下,因为有人说有第三个参数(*envp[]),这是真的,有,但不是POSIX安全,如果你想让你的程序使用环境变量,你应该使用extern char environ;D
这两个
int main(int argc, char *argv[]);
int main();
是C或c++程序入口点的合法定义。Stroustrup: c++风格和技术常见问题解答详细介绍了一些主要函数可能或合法的变化。
argv和argc是在C和c++中将命令行参数传递给main()的方式。
Argc将是argv所指向的字符串数。这将(在实践中)是1加上参数的数量,因为几乎所有的实现都将程序名放在数组的前面。
根据约定,变量命名为argc(参数计数)和argv(参数向量),但它们可以被赋予任何有效的标识符:int main(int num_args, char** arg_strings)同样有效。
如果不打算处理命令行参数,也可以完全省略它们,生成int main()。
试试下面的程序:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
使用./test a1 b2 c3运行它将输出
Have 4 arguments:
./test
a1
b2
c3
当使用int和char**时,第一个参数将是调用程序的命令数量,第二个参数是所有这些命令
假设你这样运行你的程序(使用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)。