5

时,当要打印的第一个命令行参数,以避免指针运算:如何使用char ** argv的

std::cout << argv[0] << std::endl; 

铛,整洁给出了警告:

警告:“不要用指针运算” 从[cppcoreguidelines-PRO-边界指针算术]

有一种使用的值的另一种方法0而不使用指针算术?是不是通过任何明智的方法访问char**将不得不使用指针算术?

我明白有一些专门的函数来处理命令行参数,但它们看起来太重量,不能打印一个参数。

我正在编写c++,使用clang编译器和cmake编译。

+2

如果你只需要'argv [0]',你可以使用'* argv'。但除此之外,不。 –

+0

尝试使用'&argv [0]'。我相信'cout'想要一个指向单个字符的指针。 –

+0

如果你制作'argv'数组而不是指针,它仍然会抱怨吗? 'char * argv []'? – spectras

回答

5

clang-tidy - cppcoreguidelines-pro-bounds-pointer-arithmetic

指针应该只适用于单对象,指针运算是脆弱的,容易出错。 span<T>是用于访问数据数组的边界检查安全类型。

所以,是的:

有没有办法使用的argv的值,而无需使用指针运算的另一种方式?是不是通过任何明智的方法访问char **将不得不使用指针算术?

你完全正确。然而,指南是关于隐藏指针算术,让一个辅助类在执行算术之前进行边界检查。您可以从argvargc构建span<char*>

+0

然而,'span'的问题在于它是被边界检查的。我讨厌边界检查的容器。 – SergeyA

+0

@SergeyA这听起来像你从根本上不同意指导原则。这是完全公平的,在这种情况下,不要打开这个警告。 – hvd

+0

我同意他们中的大多数人,但是我发现这个特别的规则被认为是非常糟糕的。每次访问的分支都不是我想要的代码。 – SergeyA