如何解决这一问题+;合规警告 int-foo(常量数组[]){ int x; 对于(i=0;i已经声明数组const,我在C++编程),
首先要注意的是<代码> int fo(const uint 8xt数组[])< /> >等效于int <代码> fo(const uint 8xt*数组),即函数采用指向如何解决这一问题+;合规警告 int-foo(常量数组[]){ int x; 对于(i=0;i已经声明数组const,我在C++编程),,c++,C++,首先要注意的是 int fo(const uint 8xt数组[])< /> >等效于int fo(const uint 8xt*数组),即函数采用指向常量的指针,而不是数组。指针本身不是常量,指针对象是。签名应为: int foo(const uint8_t array[]) { int x; for(i=0;i<5;i++){ x= array[i]; } return 0; } 作为记录,我不认为此警告特别有用。参数是按值获取的,调用方不关心函数如何处理它。此外,在比较函
常量的指针,而不是数组。指针本身不是常量,指针对象是。签名应为:
int foo(const uint8_t array[]) {
int x;
for(i=0;i<5;i++){
x= array[i];
}
return 0;
}
作为记录,我不认为此警告特别有用。参数是按值获取的,调用方不关心函数如何处理它。此外,在比较函数签名时,忽略了参数上的顶级常量限定符,这可能会导致一些混淆
例如,void foo(int)
和void foo(const int)
是相同的签名
编辑:
因此,根据,MISRA不知道不能按值传递数组,并抱怨数组索引与指针算法的工作方式不同。不寒而栗……问题是不能使用数组语法添加顶级const
,这使得对这两个警告的修复相互排斥
试着这样做,然后:
int foo(const uint8_t* const array)
记住,不管语法如何,函数实际上接受一个指针,并且与
typedef const uint8_t Array[];
int foo(const Array arr);
因此array
指向一个常量字节数组;但它本身并不是常量。警告指出,由于函数不修改指针,它可以(至少根据此规则,应该)是常量:
int foo(const uint8_t * array)
还有另一种方法,它似乎位于
要安全地向前移动指针,只需使用std::advance(array,1)
,然后只需取消引用(*array)即可访问该值
,位置,这似乎摆脱了问题中的MISRA警告。正是如此……我在提出这个问题之前尝试了同样的方法,但之后它又开始给出不同的警告,如“规则5-0-15,使用了数组索引以外的指针算术”==>对于x=array[i];@suhel哇,这……太可怕了:)更新了答案。@suhel如果您能反馈typedef
是否有效,我将不胜感激。
int foo(const uint8_t * const array)