5

Verwendung Beim Versuch, das erste Befehlszeilenargument zu drucken:Wie Zeigerarithmetik zu vermeiden, wenn char ** argv

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

Klirren-ordentlich gibt die Warnung:

Warnung: ‚nicht verwenden Zeigerarithmetik‘ von [cppcoreguidelines-pro-Grenzen-Pointer-Arithmetik]

gibt es eine alternative Möglichkeit, die Werte vonzu verwenden 0 ohne Zeigerarithmetik zu verwenden? Zugriff auf char** nicht durch eine sinnvolle Methode, Zeigerarithmetik verwenden zu müssen?

Ich schätze, es gibt einige spezialisierte Funktionen, um Befehlszeilenargumente zu behandeln, aber sie scheinen zu schwer zu sein, um einfach ein Argument zu drucken.

Ich schreibe in c++, mit dem clang Compiler und Gebäude mit cmake.

+2

Wenn Sie nur 'argv [0]' benötigen, können Sie '* argv' verwenden. Aber darüber hinaus, nein. –

+0

Versuchen Sie es mit '& argv [0]'. Ich glaube, "cout" will einen Zeiger auf ein einzelnes Zeichen. –

+0

Beklagt es sich noch, wenn Sie 'argv' ein Array und keinen Zeiger machen? 'char * argv []'? – spectras

Antwort

5

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

Pointers sollte nur auf einzelne Objekte beziehen, und Zeigerarithmetik ist zerbrechlich und leicht etwas falsch zu laufen. span<T> ist ein bounds-checked, sicherer Typ für den Zugriff auf Datenfelder.

Also ja:

Gibt es eine alternative Möglichkeit, die Werte von argv zu verwenden, ohne Zeiger-Arithmetik? Zugriff auf ein Zeichen ** nicht durch eine sinnvolle Methode, Zeigerarithmetik zu verwenden?

Sie sind völlig richtig. In der Richtlinie geht es jedoch darum, die Zeigerarithmetik zu verbergen, indem eine Hilfsklasse Begrenzungsüberprüfungen vor der Ausführung der Arithmetik durchführt. Sie können einen span<char*> von argv und argc konstruieren.

+0

Das Problem mit "span" ist jedoch, dass es grenzüberwacht ist. Ich hasse gebundene Behälter. – SergeyA

+0

@SergeyA Das hört sich so an, als ob Sie grundsätzlich nicht mit der Richtlinie übereinstimmen. Das ist vollkommen fair, und in diesem Fall schalten Sie diese Warnung nicht ein. – hvd

+0

Ich bin mit der Mehrheit von ihnen einverstanden, aber diese besondere Regel finde ich schlecht gedacht. Ein Zweig bei jedem Zugriff ist nicht das, was ich jemals in meinem Code haben möchte. – SergeyA

Verwandte Themen