C 代码上的 Lint:函数的参数(指针)可以是 const。 *但是*我正在写信给传递的指针

Lint on C code: parameter of function (a pointer) could be const. *But* I am writing to passed pointer

我是第一次使用 Lint,它告诉我以下信息:

parameter 'p_h_attr' of function
    'get_dev_info_service_id_attr(ble_attribute_t *)' could be const

对于这个函数:

static void get_dev_info_service_id_attr(ble_attribute_t *p_h_attr)
{
    p_h_attr->p_attr = (void *)ble_char_system_id_value;
    p_h_attr->attr_len = sizeof(ble_char_system_id_value);
}

但是,当然,如果我将 p_h_attr 设为 const,编译器会报错,因为我正在写入传递的结构指针。

我该如何解决这个问题?

大多数 linter 都可以选择向 linter 抱怨的特定行添加异常,但这样做是不对的。您应该检查 linter 的文档以了解如何防止将其视为错误。

通常,此类异常采用特殊格式的注释形式,指示 linter 跳过下一行,或某个代码块,或所有文件中的特定 linter warning/error(这可能不会在评论中,但直接到一些配置文件,其中 linter 已保存规则)。

编辑

我发现,仔细阅读后,其他答案可以更好地回答您的问题。不过希望这对您以后有所帮助!

Lint 建议您将 p_h_attr 设为 const 指针,而不是指向 const 的指针。 const 关键字的位置很重要。预期的是:

static void get_dev_info_service_id_attr(ble_attribute_t * const p_h_attr)
    ...

但正如其他人在评论中指出的那样,为 C 函数声明参数 const 至少是有争议的:没有任何好处,因为它是按值传递的。当然,指向 const 的指针是完全不同的东西。

我觉得是下面的意思

static void get_dev_info_service_id_attr(ble_attribute_t * const p_h_attr)
{
    p_h_attr->p_attr = (void *)ble_char_system_id_value;
    p_h_attr->attr_len = sizeof(ble_char_system_id_value);
}

那是指针本身应该是常量而不是指向的数据。尽管对指针使用限定符 const 没有什么意义,因为它是按值传递的。即参数是函数的局部变量