C++ 使用char**argv时如何避免指针运算
尝试打印第一个命令行参数时:C++ 使用char**argv时如何避免指针运算,c++,command-line-arguments,clang++,pointer-arithmetic,clang-static-analyzer,C++,Command Line Arguments,Clang++,Pointer Arithmetic,Clang Static Analyzer,尝试打印第一个命令行参数时: std::cout << argv[0] << std::endl; std::cout来自: 指针应该只引用单个对象,指针算法很脆弱,很容易出错span是一种边界检查的安全类型,用于访问数据数组 所以是的: 是否有其他方法可以使用argv的值而不使用指针算法?难道通过任何合理的方法访问字符**不需要使用指针算法吗 你完全正确。但是,该指南是关于隐藏指针算法,让助手类在执行该算法之前进行边界检查。您可以从argv和argc构建span。例如
std::cout << argv[0] << std::endl;
std::cout来自:
指针应该只引用单个对象,指针算法很脆弱,很容易出错span
是一种边界检查的安全类型,用于访问数据数组
所以是的:
是否有其他方法可以使用argv的值而不使用指针算法?难道通过任何合理的方法访问字符**不需要使用指针算法吗
你完全正确。但是,该指南是关于隐藏指针算法,让助手类在执行该算法之前进行边界检查。您可以从argv
和argc
构建span
。例如,在C++20中,您可以编写:
auto args = std::span(argv, size_t(argc));
然后使用args
而不是argv
如果您只需要argv[0]
,您可以使用*argv
。但除此之外,没有。@spectras从来都不是数组。函数参数不能是数组。它只是实现核心指南的一部分。更好的实现应该认识到main
的特殊情况,在这种情况下,不要再为指针算法而烦恼了。@hvd Than指南应该为main
例外。这是一个众所周知的接口,不会改变,那么为什么要用这个警告来打扰开发人员呢?@SergeyA,正如我在回答中指出的那样,在不以本指南支持的方式改变接口的情况下,阅读命令行参数是可能的。但我确实认为,如果他们至少能解决这个问题,那将是一件好事。无论是通过创建一个例外,还是通过展示如何在不违反指南的情况下实现它,对我来说都无关紧要。然而,span
的问题是,它是被检查的。我讨厌你,谢尔盖亚,听起来你根本不同意这条准则。这是完全公平的,在这种情况下,不要发出警告。我同意他们大多数人的意见,但我发现这条规则的想法很糟糕。每个访问上的分支都不是我在代码中想要的。@SergeyA这没什么大不了的,只有在使用[]运算符时才会进行边界检查。当您使用迭代器和基于迭代器的构造时,没有边界检查。例如ranged for循环或和标头中的函数。我会尽可能地使用这些工具,我宁愿使用一个速度较慢的程序,也不愿使用一个未被发现的零天缓冲区溢出漏洞来让黑客运行任意代码。在C++20中没有对std::span
的边界检查。