C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?

标签 c++ char command-line-arguments program-entry-point

我理解因为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有什么不寻常之处?是不是它没有一个有效的定义。就是这样,与其他用户定义的函数不同,它没有无限多。例如,您可以定义一个名为 foo 的函数任何你喜欢的方式。 main的定义是受限制的,因为它是您程序的入口点,调用环境必须知道如何调用它。

这在 ISO C++ 标准的第 3.6.1 节中有更详细的介绍。 N4296是 2014 年版的草稿。

如果您想将整数作为命令行参数传递,请将它们作为字符串传递然后解析它们。 (atoi() 函数是执行此操作的最简单方法之一,但它不执行任何错误检查。在以 C++11 开头的 std::stoi() header 中定义的 <string> 函数更好。)

main函数接受一个字符串列表(严格来说是一个 char** 指针,指向一个 char* 指针数组的初始元素,每个指针都指向一个字符串的开头)因为它是一个非常灵活的数据结构,但它不是太复杂了。 (请注意,此处的“字符串”是 C 风格的字符串,由 '\0' 空字符终止的字符序列——不要与 C++ 标准库定义的 std::string 类型混淆。)

有各种用于解析命令行参数的开源库。例如,类 Unix 系统有一个 getopt()功能;有关详细信息,请参阅其文档。

另见 this related question .

关于C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40315273/

相关文章:

c++ - 使用 BIT Manipulation 检查两个字符串中是否有公共(public)子字符串

c++ - 在堆栈和堆上创建对象数组

c++ - GDB打印结构的字段

计算二维网格中的字符数 C

python - 如何解决: lto1: fatal error: bytecode stream in file '...' generated with LTO version 6. 0而不是预期的7.1

c - 如何在 while 循环内重新分配 *char[] ?

c - 在C中对char指针数组进行排序

c - 解析 C 中的命令行条目 : implementing a shell

java - 在 Java 中将文件路径作为参数传递

rust - 如何在所有子命令都为可选的情况下创建StructOpt命令