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