int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
它給出如下警告,如何解決這個MISRA C++標準的警告
「參數數組可以聲明爲const」 ==>我已經聲明數組常量,我編程在C++中。
int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
它給出如下警告,如何解決這個MISRA C++標準的警告
「參數數組可以聲明爲const」 ==>我已經聲明數組常量,我編程在C++中。
首先要注意的是int foo(const uint8_t array[])
等價於int foo(const uint8_t* array)
,即該函數需要一個指向const uint8_t
的指針,而不是數組。指針本身不是const
,指針是。簽名應該是:
int foo(const uint8_t* const array)
爲了記錄,我沒有發現這個警告特別有用。該參數是按值取值的,調用者可以不關心函數用它做什麼。此外,比較函數簽名時忽略參數頂層const限定符,這可能會導致一些混淆。例如,
void foo(int)
和void foo(const int)
是相同的簽名。
編輯:
因此,根據your comment,MISRA不知道,你不能按值傳遞數組,並抱怨說,數組索引工作不同於指針運算。 Shder ...問題是,您不能使用數組語法添加頂級const
,這使得修復這兩個警告互相排斥。
嘗試欺騙像這樣,那麼:
typedef const uint8_t Array[];
int foo(const Array arr);
記住的是,儘管語法,功能其實需要一個指針,相當於
int foo(const uint8_t * array)
所以array
指向數組的常量字節;但本身並不固定。該警告指出,由於功能不修改指針,它可以(而且,至少根據這條規則,應該)是常數:
int foo(const uint8_t * const array)
還有另一種方式,它似乎是下<iterator>
向前移動鼠標指針「安全」您只需使用std::advance(array, 1)
然後訪問你簡直值取消引用(*array)
,位置,這似乎擺脫問題的MISRA警告。
確切地說......我在提出這個問題之前也曾嘗試過,但之後它開始給出一個不同的警告,例如「規則5-0-15,除了數組索引使用的指針算術」==>陣列[I]; – suhel
@suhel哇,這是...可怕:)更新了答案。 – jrok
@suhel無論'typedef'是否有效,我都會感激您的反饋。 – jrok