为什么在函数声明中传递const指针参数无效

Mat*_*att 0 c pointers arguments

问题描述

我有一个函数,它接受一个指向const double数组的const指针,在该数组上我使用大小作为my_func内的边界检查进行循环。

在.h中声明

void my_func(const double * const my_array, size_t size);
Run Code Online (Sandbox Code Playgroud)

在.c中实现

void my_func(const double * const my_array, size_t size) {
  for (size_t idx = 0; idx < size; idx++) {
    do_something_with(my_array[idx]);
  }
}
Run Code Online (Sandbox Code Playgroud)

我不希望在函数内部更改指针,从而使其成为现实* const。我不希望它指向的数据被更改,因此const double

但是Clang-Tidy希望我让函数声明将const放到指针上,使其变为

void my_func(const double * my_array, size_t size);
Run Code Online (Sandbox Code Playgroud)

Clang-Tidy:参数'my_array'在函数声明中是const限定的;参数的const限定仅在函数定义中起作用

如果我遵循该建议,但又希望保持上面的约束,那么我的函数声明和定义将不再相同。

问题

1)
假设我的指针参数不是const(const double * pointer_arg),如果我pointer_arg在函数内部进行更改以指向另一个const double,则该更改在函数外部是否可见?也就是说,在执行完我的函数的那一行之后,填充pointer_arg指向何处?如果看不见,是否表示指针已按值复制?这有可能吗?

2)
声明声明中的const无效的决定背后的原因是什么?

3)
在声明和定义中使用不同的函数签名可能会有什么好处?对我来说,看我的头文件还不清楚实现的工作原理,函数内部是否为const,不是吗?这让我或代码合作者感到困惑。

4)
我应该在声明中删除const吗?什么是最好的做法,在这种情况下?

srd*_*vic 5

1)假设我的指针参数不是const(const double * pointer_arg),如果我将函数内部的pointer_arg更改为指向另一个const double,则该更改在函数外部是否可见?

不,它不可见。

也就是说,在执行完我的函数的那一行之后,填充pointer_arg指向哪里?

和之前一样。

如果看不见,是否表示指针已按值复制?这有可能吗?

就是这样

2)声明声明中的const无效的决定背后的原因是什么?

由于它是按值传输的,const因此(对调用方)无效。

3)在声明和定义中使用不同的函数签名可能会有什么好处?

没有。实际上,它甚至不应该在C ++中编译。

4)我应该在声明中删除const吗?在这种情况下,最佳做法是什么?

是的,您应该删除const,因为它没有太大帮助。您仅禁止该函数更改其指针副本,而调用者无需担心。

  • 声明“ void my_func(double const * my_array,size_t size);”将不允许函数更改“ my_array”的元素(“ my_array”指向_to_)。函数可能会更改“ my_array”指针本身,但没有理由。 (2认同)