C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?
C++ - Should argv[] in the int main be always of the type char* (or char** if argv is used)?
我明白了,因为argc
是参数个数,所以可以是int。但是为什么 argv
应该是 char pointer
类型呢?这是否意味着我不能传递整数参数并在数学运算中使用 argv[1]
?
编辑:为了更清楚,是否可以写类似int* argv[]
的东西。 argv
是否已定义为 char*
类型以致无法更改?
实际上 main
有两个有效定义:
int main() { /* ... */ }
和
int main(int argc, char *argv[]) { /* ... */ }
或同等学历。 (请注意,作为参数,char *argv[]
等同于 char **argv
,这是更准确的表示,指向指向 char
的指针。)
实现可以但不要求支持其他形式;例如,某些系统支持额外的 char *envp[]
参数。
main
的不寻常之处不在于它没有一个有效的定义。就是这样,与其他 user-defined 函数不同,它没有无限多。例如,您可以任意定义一个名为 foo
的函数。 main
的定义受到限制,因为它是您程序的入口点,调用环境必须知道如何调用它。
这在 ISO C++ 标准的第 3.6.1 节中有更详细的介绍。 N4296 是 2014 版的草稿。
如果您想将整数作为 command-line 参数传递,请将它们作为字符串传递然后解析它们。 (atoi()
函数是执行此操作的最简单方法之一,但它不进行任何错误检查。std::stoi()
函数定义在 <string>
header 开始使用 C++11 更好。)
main
函数接受一个字符串列表(严格来说是一个char**
指针指向一个char*
指针数组的初始元素,每个指针指向一个字符串),因为它是一个非常灵活的数据结构,但它并不过分复杂。 (请注意,这里的 "string" 是一个 C-style 字符串,由 '[=26=]'
空字符终止的字符序列——不要与由 std::string
定义的类型混淆C++ 标准库。)
有多种 open-source 库用于解析 command-line 参数。例如,Unix-like 系统有一个 getopt()
函数;有关详细信息,请参阅其文档。
我明白了,因为argc
是参数个数,所以可以是int。但是为什么 argv
应该是 char pointer
类型呢?这是否意味着我不能传递整数参数并在数学运算中使用 argv[1]
?
编辑:为了更清楚,是否可以写类似int* argv[]
的东西。 argv
是否已定义为 char*
类型以致无法更改?
实际上 main
有两个有效定义:
int main() { /* ... */ }
和
int main(int argc, char *argv[]) { /* ... */ }
或同等学历。 (请注意,作为参数,char *argv[]
等同于 char **argv
,这是更准确的表示,指向指向 char
的指针。)
实现可以但不要求支持其他形式;例如,某些系统支持额外的 char *envp[]
参数。
main
的不寻常之处不在于它没有一个有效的定义。就是这样,与其他 user-defined 函数不同,它没有无限多。例如,您可以任意定义一个名为 foo
的函数。 main
的定义受到限制,因为它是您程序的入口点,调用环境必须知道如何调用它。
这在 ISO C++ 标准的第 3.6.1 节中有更详细的介绍。 N4296 是 2014 版的草稿。
如果您想将整数作为 command-line 参数传递,请将它们作为字符串传递然后解析它们。 (atoi()
函数是执行此操作的最简单方法之一,但它不进行任何错误检查。std::stoi()
函数定义在 <string>
header 开始使用 C++11 更好。)
main
函数接受一个字符串列表(严格来说是一个char**
指针指向一个char*
指针数组的初始元素,每个指针指向一个字符串),因为它是一个非常灵活的数据结构,但它并不过分复杂。 (请注意,这里的 "string" 是一个 C-style 字符串,由 '[=26=]'
空字符终止的字符序列——不要与由 std::string
定义的类型混淆C++ 标准库。)
有多种 open-source 库用于解析 command-line 参数。例如,Unix-like 系统有一个 getopt()
函数;有关详细信息,请参阅其文档。