在许多C++ IDE的和编译器,当它产生的主要功能对你来说,它看起来像这样:int argc,char * argv []是什么意思?
int main(int argc, char *argv[])
当我的代码C++没有一个IDE,只是一个命令行编译器,I型:
int main()
没有任何参数。这是什么意思,对我的程序至关重要?
在许多C++ IDE的和编译器,当它产生的主要功能对你来说,它看起来像这样:int argc,char * argv []是什么意思?
int main(int argc, char *argv[])
当我的代码C++没有一个IDE,只是一个命令行编译器,I型:
int main()
没有任何参数。这是什么意思,对我的程序至关重要?
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
argc
被传递到命令行程序和argv
参数的数目是数组参数。
可以遍历的参数知道他们的数目喜欢:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
主参数表示提供给程序的命令行参数,当它被启动。 argc参数表示命令行参数的个数,char * argv []是表示命令行上提供的各个参数的字符串数组(字符指针)。
Argv []始终将argv [arg]指定为空指针。并且Argv [0]始终是(完整路径)/ executableName作为nul结尾的字符串 – user3629249 2014-12-21 08:09:14
@ user3629249:不一定; 'argv [0]'就是启动C程序的程序给它的'argv [0]'。在Bash的情况下,它通常(可能总是)可执行文件的路径名,但Bash不是执行其他程序的唯一程序。尽管古怪,但可以使用:char * args [] = {“cat”,“/ dev/null”,“/ etc/passwd”,0}; execv(“/ bin/ls”,args);'。在很多系统中,程序看到的值为'argv [0]',即使可执行文件是'/ bin/ls',也会是'cat'。 – 2016-02-05 03:36:33
两者的
int main(int argc, char *argv[]);
int main();
是入口点C或C++程序的法律定义。 Stroustrup: C++ Style and Technique FAQ详细介绍了您的主要功能可能或合法的一些变体。
可能要将void放在...'int main()'==>'int main(void)'...为了兼容性和可读性。我不知道是否所有旧版本的C都允许void函数在声明中有一个空的参数列表。 – dylnmc 2014-09-25 16:24:06
@dylnmc这不会提供任何可读性增益,并且在所有C++版本中都完全相同。只有在C这有区别,但只在声明中,而不是在定义中。 – Ruslan 2015-05-05 09:35:09
@Ruslan对不起,我刚刚学习C时发布了这个,我可能已经在C的早期版本中读过''void'是必需的。不要在此引用我的意思,我现在知道这是一个稍微愚蠢的评论。不过,它不会受伤。 – dylnmc 2015-05-07 01:41:44
的main
函数可以有两个参数,的argc和的argv。argc是一个整型参数,它是传递给程序的参数个数。
程序名称是总是第一个参数,所以会出现的至少一个参数的程序和的argc最小值将等于1。但是如果一个程序本身有两个参数值argc将是三。
参数的argv指向一个字符串数组,称为“参数向量”。它是函数参数的一维字符串数组。
它也会有用:http://crasseux.com/books/ctutorial/argc-and-argv。html – moshtagh 2015-07-21 08:32:35
假设你这样运行程序(使用sh
语法):
myprog arg1 arg2 'arg 3'
如果你宣布你的主要为int main(int argc, char *argv[])
,然后(在大多数环境中),您main()
将被称为如果像:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
但是,如果你的声明作为主要int main()
,它会被称为像
exit(main());
并且您没有获得传递的参数。
两个额外的事情需要注意:
main
仅有的两个标准的授权签名。如果一个特定的平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该依赖于便携式程序。*argv[]
和**argv
完全相同,因此您可以将int main(int argc, char *argv[])
写为int main(int argc, char **argv)
。如果我们在技术上,['basic.start.main/2'](https://timsong-cpp.github.io/cppwp/basic.start.main#2)明确允许实现定义的附加版本main()',只要实现提供了两个预定义的版本。所以,他们不是非常不合格。最常见的是'envp',它在C和C++中都非常出名,[它实际上是C标准J.5节(共同扩展)中的第一个条目](http://port70.net /~nsz/c/c11/n1570.html#J.5)。 – 2017-01-22 22:40:54
谢谢你的美丽@Justin。答案更新更加正确。 – 2017-01-23 12:34:52
@TobySpeight \t 如果argc <3返回错误,该怎么办?什么可能出错? – AVI 2017-12-04 15:50:44
int main();
这是一个简单的声明。它不能接受任何命令行参数。
int main(int argc, char* argv[]);
当您的程序必须采用命令行参数时,会使用此声明。当运行像这样:
myprogram arg1 arg2 arg3
argc
,或参数计数,将被设置为4(四个参数),和argv
,或参数向量,将与字符串指针为“myprogram”,“ARG1”来填充, “arg2”和“arg3”。 程序调用(myprogram
)包含在参数中!
或者,你可以使用:
int main(int argc, char** argv);
这也是有效的。
还有一个参数,您可以添加:
int main (int argc, char *argv[], char *envp[])
的envp
参数也包含环境变量。每个条目的格式如下:
VARIABLENAME=VariableValue
这样的:
SHELL=/bin/bash
环境变量列表是空值终止。
如果你的程序将忽略命令行参数,那么你写的很好。如果你的程序需要处理命令行参数,那么IDE就是正确的。 – 2010-06-11 15:57:17
提示黑客:尝试声明'int main(int argc,char * argv [],char * envp [])'并打印出最后一个参数。 ';)' – ulidtko 2015-10-05 11:17:59
@ulidtko这是不好的,你是教新手在他们的程序中引入漏洞;) – 2016-04-27 12:29:00