int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
它会发出如下警告,
“参数数组可以声明为const”==&gt;我已经声明了数组const,我用C ++编程。
答案 0 :(得分: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并不知道你不能按值传递数组,并抱怨数组索引的工作方式与指针算法不同。 Shudder ...... 问题在于,您无法使用数组语法添加顶级const
,这使得对这两个警告的修复变得不可思议。
尝试欺骗它,然后:
typedef const uint8_t Array[];
int foo(const Array arr);
答案 1 :(得分:1)
请记住,尽管有语法,但该函数实际上是一个指针,相当于
int foo(const uint8_t * array)
所以array
指向一个常量字节数组;但本身并不是一成不变的。警告指出,由于函数没有修改指针,它可以(并且,至少根据这个规则,应该)是不变的:
int foo(const uint8_t * const array)
答案 2 :(得分:0)
还有另一种方式,它似乎在<iterator>
要将指针向前移动&#39;安全&#39; ,您只需使用std::advance(array, 1)
然后访问该值,您只需解除引用(*array)
的位置,这似乎摆脱有问题的MISRA警告。