为什么我们使用"const char* const* argv"而不是"char *"?

why we use "const char* const* argv" instead of "char *"?

本文关键字:const char argv 为什么 我们      更新时间:2023-10-16

我正在使用"NS2模拟器"模拟计算机网络。我真的不明白为什么我们要用const char* const* argv而不是char * ?

我可以用char *代替吗?有很多关于这个主题的QA,但我对此感到困惑。请不要把这个问题标记为"重复"。为什么我们在下面的函数中使用const char* const* argv ?这是c++标准中的规则吗?我可以使用stringchar **代替吗?

  Function Connector::command.
  //~ns/common/connector.cc
  int Connector::command(int argc, const char*const* argv)
  {
  Tcl& tcl = Tcl::instance();
  ...
  if (argc == 3) {
  if (strcmp(argv[1], "target") == 0) {
  ...
  target_ = (NsObject*)TclObject::lookup(argv[2]);
  ...
  }
  ...
  }
  return (NsObject::command(argc, argv));
  }

const char*const* argv表示"指向常量的指针指向常量char"。它与char*不同。使用const修饰符是有原因的,因为argv指针不会被重新赋值,元素必须通过下标访问。

这使得调用者可以安全地动态分配argv,将其传递给command(),然后稍后释放它。否则,如果在释放指针之前将其指向其他地方,则泄露了它曾经指向的内存。

const char* const* argv创建了两层间接指针——第一级是const pointer to a const char,第二级是指向const指针的指针。

程序员可以按照他们认为合适的方式const限定参数。这个签名的好处:

void func(const char* const* argv);

…是它将接受参数数组(传递给main()exec()的类型),带有任何const限定条件。

所以这些都是可以接受的:

int main(int, char** argv)
{
    func(argv);
}
int main(int, const char** argv)
{
    func(argv);
}
int main(int, char* const* argv)
{
    func(argv);
}
int main(int, const char* const* argv)
{
    func(argv);
}

因此,如果你正在编写一个函数来接受参数数组参数(你的函数不会修改),那么它可能是最好的签名选择。

为什么我们应该使用"const…用"char *"代替" Argv "

'const'来自你,程序员,命令编译器在你写的代码试图修改argv时通知你。

可以用char *代替吗?

有可能,但有时并不重要。但是,如果您错误地修改了argv(或任何const var名称),那么编译器将不会让您知道您犯了一个错误,并且结果可能是您不想要的,甚至是UB.