【问题标题】:why we use "const char* const* argv" instead of "char *"? [duplicate]为什么我们使用“const char* const* argv”而不是“char *”? [复制]
【发布时间】:2016-07-05 03:24:09
【问题描述】:

我正在使用“NS2 Simulator”模拟计算机网络。我真的不明白为什么我们应该使用const char* const* argv 而不是char *?

我可以用char * 代替那个吗?关于这个主题有很多质量保证,但我对此感到困惑。请不要将此问题标记为“重复”。 为什么我们在下面的函数中使用const char* const* argv?这是 c++ 标准中的规则吗?我可以使用string 或char ** 来代替吗?

  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));
  }

【问题讨论】:

  • 假设argv是main的典型参数,那么它应该是char**,而不是char*而不是const char* const*。
  • 如果你想了解const char* const* argv 的这个“怪物”是什么意思,我强烈建议你阅读this。如上所述,标准 C 要求 main 的第二个参数为 char** 类型。
  • @Cornstalks 或 char* argv[] 也可以,只是为了 OP 的利益而发布此内容。
  • @JamesAdkison 但这只是 char** 的语法糖,不是吗?
  • @vsoftco 是的。我只是指出可能遇到的其他语法。

标签: c++ argv ns2


【解决方案1】:

const char*const* argv 表示“指向常量 char 的常量指针”。它与 char* 不同。 const 修饰符是有原因的,因为不会重新分配 argv 指针,因此必须通过下标访问元素。

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

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

【讨论】:

    【解决方案2】:

    程序员可以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);
    }
    

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

    【讨论】:

      【解决方案3】:

      为什么我们应该使用“const ... argv”而不是“char *”?

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

      我可以使用 char * 来代替吗?

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

      【讨论】:

      • 可以分享一个可以UB的场景吗?
      猜你喜欢
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2012-07-21
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      相关资源
      最近更新 更多