5

Podczas próby wydrukowania pierwszej linii poleceń argumentu:Jak uniknąć arytmetyki wskaźników przy użyciu char ** argv

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

dzyń-uporządkowany daje ostrzeżenie:

ostrzeżenie: „Nie używać wskaźnik arytmetyka” z [cppcoreguidelines-pro-granic-pointer-arytmetyka]

Czy istnieje alternatywny sposób na wykorzystanie wartości argv bez użycia arytmetyki wskaźnika? Czy nie ma dostępu do char** za pomocą jakiejkolwiek rozsądnej metody, która będzie musiała używać arytmetyki wskaźnika?

Rozumiem, że istnieją pewne wyspecjalizowane funkcje do obsługi argumentów wiersza poleceń, ale wydają się zbyt ciężkie, aby po prostu wydrukować jeden argument.

Piszę w c++, używając kompilatora clang i budynku z cmake.

+2

Jeśli potrzebujesz tylko "argv [0]", możesz użyć '* argv'. Ale poza tym, nie. –

+0

Spróbuj użyć 'i argv [0]'. Wierzę, że 'cout' chce wskaźnika do pojedynczej postaci. –

+0

Czy nadal narzeka, jeśli tworzysz 'argv' tablicę, a nie wskaźnik? 'char * argv []'? – spectras

Odpowiedz

5

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

Wskaźniki powinny odnosić się jedynie do pojedynczych obiektów, a wskaźnik arytmetyka jest kruchy i łatwo dostać się źle. span<T> to sprawdzony i bezpieczny sposób dostępu do tablic danych.

Więc tak:

Czy istnieje alternatywny sposób korzystania z wartości argv bez użycia wskaźnika arytmetyki? Czy dostęp do char ** przez jakąkolwiek sensowną metodę nie będzie wymagał użycia arytmetyki wskaźnika?

Masz całkowitą rację. Jednak wytyczne dotyczą ukrywania arytmetycznych wskaźników, pozwalając klasie pomocniczej ograniczać kontrole przed wykonaniem arytmetyki. Możesz zbudować span<char*> z argv i argc.

+0

Problem z 'span' polega jednak na tym, że jest on sprawdzany pod kątem granic. Nienawidzę sprawdzonych kontenerów. – SergeyA

+0

@SergeyA Wygląda na to, że zasadniczo nie zgadzasz się z wytycznymi. Co jest całkowicie sprawiedliwe, i w takim przypadku nie włączaj tego ostrzeżenia. – hvd

+0

Zgadzam się z większością z nich, ale ta szczególna zasada jest dla mnie źle pomyślana. Oddział przy każdym dostępie nie jest tym, czego potrzebuję w moim kodzie. – SergeyA