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吗?什么是最好的做法,在这种情况下?
1)假设我的指针参数不是const(const double * pointer_arg),如果我将函数内部的pointer_arg更改为指向另一个const double,则该更改在函数外部是否可见?
不,它不可见。
也就是说,在执行完我的函数的那一行之后,填充pointer_arg指向哪里?
和之前一样。
如果看不见,是否表示指针已按值复制?这有可能吗?
就是这样
2)声明声明中的const无效的决定背后的原因是什么?
由于它是按值传输的,const因此(对调用方)无效。
3)在声明和定义中使用不同的函数签名可能会有什么好处?
没有。实际上,它甚至不应该在C ++中编译。
4)我应该在声明中删除const吗?在这种情况下,最佳做法是什么?
是的,您应该删除const,因为它没有太大帮助。您仅禁止该函数更改其指针副本,而调用者无需担心。