int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
以下是警告信息:
"参数数组可以被声明为const" ==> 我已经声明了数组为const,我正在使用C++编程。
int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
以下是警告信息:
"参数数组可以被声明为const" ==> 我已经声明了数组为const,我正在使用C++编程。
需要注意的第一件事是int foo(const uint8_t array[])
等同于int foo(const uint8_t* array)
,即函数接受一个指向const uint8_t
的指针,而不是一个数组。指针本身并不是const
的,只有指向的内容是const
的。函数签名应该为:
int foo(const uint8_t* const array)
void foo(int)
和void foo(const int)
是相同的签名。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警告。
typedef
是否有效。 - jrok