我有一个函数,该函数接受一个指向const double数组的const指针,在该数组上我使用大小作为my_func内的边界检查进行循环。
.h中的声明
void my_func(const double * const my_array, size_t size);
.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]);
}
}
我不希望在函数内部更改指针,因此使其变为* const
。我不希望它指向的数据被更改,因此const double
。
Clang-Tidy但是希望我让函数 declaration 删除指针上的const,使其成为
void my_func(const double * my_array, size_t size);
Clang-Tidy:参数'my_array'在函数声明中是const限定的;参数的const限定仅在函数定义中起作用
如果我遵循该建议,但又希望保持上面的约束,那么我的函数声明和定义将不再相同。
1)
假设我的指针参数不是const(const double * pointer_arg
),如果我在函数内部将pointer_arg
更改为指向另一个const double
,该更改在函数外部是否可见?也就是说,在我执行函数的那一行之后,填充pointer_arg
指向哪里?如果看不见,是否表示指针已按值复制?这有可能吗?
2)
声明中的const不起作用的决定背后的原因是什么?
3)
在声明和定义中使用不同的函数签名可能会有什么好处?对我来说,看我的头文件还不清楚实现的工作原理,它在函数内部是const,不是吗?这使我或代码协作者感到困惑。
4)
我应该在声明中删除const吗?在这种情况下,什么是最佳实践?
答案 0 :(得分:5)
1) 假设我的指针参数不是const(const double * pointer_arg),如果我将函数内部的pointer_arg更改为指向另一个const double,则该更改在函数外部是否可见?
不,它不可见。
也就是说,在执行函数的那一行之后,填充指针指针指向何处?
与以前相同。
如果不可见,是否表示指针已按值复制?这有可能吗?
就是这样。
2) 声明中的const不起作用的决定背后的原因是什么?
由于它是按值转移的,因此const
无效(对调用者而言)。
3) 在声明和定义中使用不同的函数签名可能会有什么好处?
没有。实际上,它甚至不应该在C ++中编译。
4) 我应该在声明中删除const吗?在这种情况下,最佳做法是什么?
是的,您应该放下const
,因为它没有太大帮助。您只是禁止该函数更改其指针副本,而调用者无需担心。
答案 1 :(得分:0)
const
右侧的*
属性仅影响指针本身,而不影响所指向的内存,指针本身存储为自动变量。
void my_func(const double * my_array, size_t size);
与
相同void my_func(const double * const my_array, size_t size);
在使用my_array
的情况下,const仅影响实现。 my_array
具有自动存储期限,并且在应用const
时无法在实现中更改。
给出原型:
int add(int a, int b);
// same as
int add(int const a, int const b);
有用的用法,强制将参数a
和b
保持在函数内部不变:
int add(int const a, int const b) {
// a = a*b; // error
return a+b;
};