skr*_*obo 0 c++ program-entry-point char command-line-arguments
我知道,因为argc是参数的数量,它可以是一个int.但为什么应该argv是char pointer类型?这是否意味着我无法传递整数参数并argv[1]在数学运算中使用?
编辑:为了使它更清晰,是否可以写出像int* argv[].是否argv已定义为char*无法更改的类型?
实际上有两个有效的定义main:
int main() { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
和
int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
或同等学历.(注意,作为参数,char *argv[]相当于char **argv,它是一个更精确的表示它是什么,指向指针的指针char.)
实现可以但不是必须支持其他形式; 例如,某些系统支持附加char *envp[]参数.
有什么不寻常之main处并不是它没有一个有效的定义.就像其他用户定义的函数一样,它没有无限多的功能.例如,您可以foo按照自己喜欢的方式定义名称.定义main是受限制的,因为它是您的程序的入口点,并且调用环境必须知道如何调用它.
这在ISO C++标准的3.6.1节中有更详细的介绍.N4296是2014年版的草稿.
如果要将整数作为命令行参数传递,请将它们作为字符串传递,然后解析它们.(该atoi()函数是执行此操作的最简单方法之一,但它不执行任何错误检查.从C++ 11开始std::stoi()的<string>头中定义的函数更好.)
该main函数接受一个字符串列表(严格来说,char**指向指针数组的初始元素的char*指针,每个指针指向一个字符串的开头),因为它是一个非常灵活的数据结构,但它并不过分复杂.(注意,这里的"字符串"是一个C风格的字符串,一个以'\0'空字符结尾的字符序列- 不要与std::stringC++标准库定义的类型混淆.)
有各种用于解析命令行参数的开源库.例如,类Unix系统有一个getopt()功能; 有关详细信息,请参阅其文档.
另请参阅此相关问题.