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