【发布时间】:2016-03-24 11:49:16
【问题描述】:
有人提出,在现代 C 语言中,我们应该始终通过数组指针将数组传递给函数,因为数组指针具有强类型。示例:
void func (size_t n, int (*arr)[n]);
...
int array [3];
func(3, &array);
这听起来可能是防止各种类型相关和数组越界错误的好主意。但后来我突然想到我不知道如何将 const 正确性应用于此。
如果我这样做void func (size_t n, const int (*arr)[n]),那么它是正确的。但是由于指针类型不兼容,我无法再传递数组。 int (*)[3] 与 const int (*)[3]。限定符属于指向的数据,而不属于指针本身。
调用者中的显式转换会破坏增加类型安全的整个想法。
如何将 const 正确性应用于作为参数传递的数组指针?有可能吗?
编辑
就像信息一样,有人说像这样通过指针传递数组的想法可能起源于 MISRA C++:2008 5-2-12。参见例如PRQA's high integrity C++ standard。
【问题讨论】:
-
我想关键是在设计一切时都要考虑到 const 正确性?
-
正确的传递指针比你传递的数组少一维。
int *arr为int ia[3]。这样你只需传递数组本身。或者,对称 - 只需对传递的数组使用相同的参数声明:int arr[]并使用形式参数的隐式转换。 -
@Olaf 不,那么你会得到数组衰减并且整个增加的类型安全参数都丢失了。与
int* param相比,参数int param[n]没有增加类型安全性。 -
@Lundin:好的,所以您接受为每个阵列访问添加的
*。明白了。 -
这就是为什么我个人认为 MISRA 是一本不错的读物,但主要是因为理性。将风格指南视为一种宗教总是不好的。如果涉及合规性与质量,我总是更喜欢后者。 (我很清楚我们并不总是有选择的余地)
标签: c const-correctness