2014-01-28 47 views
5
int foo(const uint8_t array[]) { 
int x; 
    for(i=0;i<5;i++){ 
    x= array[i]; 
} 
return 0; 
} 

它給出如下警告,如何解決這個MISRA C++標準的警告

「參數數組可以聲明爲const」 ==>我已經聲明數組常量,我編程在C++中。

回答

7

首先要注意的是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); 
+2

確切地說......我在提出這個問題之前也曾嘗試過,但之後它開始給出一個不同的警告,例如「規則5-0-15,除了數組索引使用的指針算術」==>陣列[I]; – suhel

+0

@suhel哇,這是...可怕:)更新了答案。 – jrok

+0

@suhel無論'typedef'是否有效,我都會感激您的反饋。 – jrok

1

記住的是,儘管語法,功能其實需要一個指針,相當於

int foo(const uint8_t * array) 

所以array指向數組的常量字節;但本身並不固定。該警告指出,由於功能不修改指針,它可以(而且,至少根據這條規則,應該)是常數:

int foo(const uint8_t * const array) 
0

還有另一種方式,它似乎是下<iterator>

向前移動鼠標指針「安全」您只需使用std::advance(array, 1)然後訪問你簡直值取消引用(*array),位置,這似乎擺脫問題的MISRA警告。