的签名main
必须是int main(int argc, char* argv[])
(或等价物,或int main()
)。您可以在自己的代码中将参数处理成更有用的东西。这是一个快速而草率的示例(没有适当的错误处理等)。
#include <iostream>
#include <cstdlib>
#include <vector>
int main(int argc, char * argv[])
{
std::vector<int> nums;
nums.reserve(argc-3);
int pos = 3;
// Read args into vector of ints
while (pos < argc)
{
nums.push_back(atoi(argv[pos]));
++pos;
}
// Print them
for (auto i : nums) std::cout << i << '\n';
}
这是一个运行:
$ ./a.out path1 path2 1 2 3 5 4
1
2
3
5
4
以防万一它不清楚:argc
包含传递的参数数量,包括程序的名称。所以对于$ ./a.out
argc=1
,对于$ ./a.out some list of args
argc=5
。
然后argv
是一个c
-style 字符串数组(NUL
-terminated const char *
s),其中包含每个参数的文本。
请注意,严格来说,argv
数组比它需要的长 1,并且最后一个条目保证是 NULL 指针。
对于标准极客,我没有正确的C++
2011 标准,这是来自 N3337:
3.6.1 主要功能
...
2 实现不应预定义main
功能。该功能不得重载。它的返回类型应该是 type int
,否则它的类型是实现定义的。所有实现都应允许以下两种定义main
:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
后一种形式argc
是从程序运行的环境传递给程序的参数数量。如果argc
不为零,则这些参数应作为指向以空结尾的多字节字符串 (ntmbs s) (17.5.2.1.4.2) 的初始字符的指针提供,并且argv[0]
应是指向表示使用的名称的 ntmbs 的初始字符的指针调用程序或“”。的值应为非负数。的值应为。[注意:建议在. ——尾注]argv[argc-1]
argv[0]
argc
argv[argc]
0
argv