617

在许多 C++ IDE 和编译器中,当它为您生成 main 函数时,它看起来像这样:

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

当我在没有 IDE 的情况下仅使用命令行编译器编写 C++ 代码时,我键入:

int main()

没有任何参数。这是什么意思,对我的计划至关重要吗?

4

8 回答 8

772

argv以及argc如何main()在 C 和 C++ 中传递命令行参数。

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
于 2010-06-11T15:47:14.157 回答
60

argc是从命令行传递到程序中的参数数量,并且argv是参数数组。

您可以遍历参数,知道它们的数量,例如:

for(int i = 0; i < argc; i++)
{
    // argv[i] is the argument at index i
}
于 2010-06-11T15:47:19.710 回答
20

假设您这样运行程序(使用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());

你没有得到通过的论点。

还有两点需要注意:

  1. 这是仅有的两个标准强制签名main。如果特定平台接受额外的参数或不同的返回类型,那么这是一个扩展,不应该在可移植程序中依赖。
  2. *argv[]并且**argv完全等价,所以你可以int main(int argc, char *argv[])写成int main(int argc, char **argv).
于 2015-08-20T19:01:33.433 回答
10

main表示程序启动时提供给程序的命令行参数的参数。参数表示命令行参数的argc数量,char *argv[]是一个字符串数组(字符指针),表示命令行上提供的各个参数。

于 2010-06-11T15:47:40.613 回答
10
int main();

这是一个简单的声明。它不能接受任何命令行参数。

int main(int argc, char* argv[]);

当您的程序必须采用命令行参数时使用此声明。像这样运行时:

myprogram arg1 arg2 arg3

argc或 Argument Count 将设置为 4(四个参数),并且argv或 Argument Vectors 将填充指向“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    

环境变量列表以空值结尾。

重要提示:不要在调用中直接使用任何argv或值!这是一个巨大的安全漏洞,因为恶意用户可以将环境变量设置为命令行命令并(可能)造成巨大破坏。一般来说,只是不要使用. 几乎总是有通过 C 库实现的更好的解决方案。envpsystem()system()

于 2018-01-14T19:33:00.737 回答
8

main函数可以有两个参数,argcargvargc是一个整数 ( int) 参数,它是传递给程序的参数的数量。

程序名称始终是第一个参数,因此程序至少有一个参数,最小值argc为一个。但是如果一个程序本身有两个参数,那么值argc将是三个。

参数argv指向一个字符串数组,称为参数向量。它是函数参数的一维字符串数组。

于 2015-07-21T08:28:24.363 回答
3

第一个参数是提供的参数数量,第二个参数是表示这些参数的字符串列表。

于 2010-06-11T15:48:03.087 回答
1

两者的

int main(int argc, char *argv[]);
int main();

是 C 或 C++ 程序入口点的合法定义。Stroustrup:C++ 风格和技术常见问题解答详细介绍了一些对您的主要功能可能或合法的变体。

于 2010-06-11T16:00:02.713 回答