2014-01-28 45 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警告。