为什么我们使用"const char* const* argv"而不是"char *"?
why we use "const char* const* argv" instead of "char *"?
我正在使用"NS2模拟器"模拟计算机网络。我真的不明白为什么我们要用const char* const* argv
而不是char *
?
我可以用char *
代替吗?有很多关于这个主题的QA,但我对此感到困惑。请不要把这个问题标记为"重复"。为什么我们在下面的函数中使用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));
}
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.