【问题标题】:C++ - Should argv[] in the int main be always of the type char* (or char** if argv is used)?C++ - int main 中的 argv[] 是否应该始终为 char* 类型(如果使用 argv,则为 char**)?
【发布时间】:2017-03-11 22:45:00
【问题描述】:

我知道由于argc 是参数的数量,它可以是一个整数。但是为什么argv 应该是char pointer 类型呢?这是否意味着我不能传递整数参数并在数学运算中使用argv[1]

编辑:为了更清楚,是否可以写类似int* argv[] 的东西。 argv 是否已经定义为 char* 类型以至于无法更改?

【问题讨论】:

  • 查看atoi
  • 其实我的目的是想知道是否有任何方法可以从命令行传递整数(或除字符以外的类型)参数并直接使用它们而不使用atoi

标签: c++ char command-line-arguments main


【解决方案1】:

其实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() 函数是执行此操作的最简单方法之一,但它不进行任何错误检查。std::stoi() 函数在以 C++11 开头的 <string> 标头中定义,效果更好。)

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

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

另见this related question

【讨论】:

  • 这部分很有帮助,“main 的不同之处在于它没有一个有效的定义。与其他用户定义的函数不同,它没有无限多个。”另外,感谢您提供更多信息。
  • @Schwern:OP 询问的是 C++,而不是 C(标题中提到;我刚刚添加了标签)。 C 和 C++ 在这方面存在一些差异。
  • 如果您要将某事限定为“严格来说”,请注意正确。 argv 参数不是“指向字符串指针数组的指针”。
  • @Peter:好点子。 C 标准将“指向字符串的指针”定义为指向字符串初始字符的指针(其中“字符串”定义为“以第一个空字符终止并包括第一个空字符的连续字符序列”)。 C++ 似乎对“指向字符串的指针”没有类似的定义。
猜你喜欢
  • 2020-11-03
  • 2010-10-21
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2011-07-08
  • 2014-10-09
  • 2015-08-12
  • 2011-07-08
相关资源
最近更新 更多