我试图使用const转换调用带有const矩阵参数的c函数,但是找不到阻止gcc编译器抱怨的语法。如果删除所有“const”强制转换,下面的代码编译时不会抱怨。问题类似于C function const multidimensional-array argument strange warning,但那里没有提供完全令人满意的解决方案。在下面的代码中,如果对g()的第一次调用有效,那么对g()的第二次调用也应该有效,因为它在语法上是相同的。但事实并非如此。 g()的第二个版本是首选,因为它不需要事先知道矩阵的类型。
/* file t.c */
void f(const int a[2]) {/*empty*/}
void g(const int b[2][2]) {/*empty*/}
int main()
{
int a[2];
int b[2][2];
f((const int (*)) a); /* ok */
f((const typeof(&a[0])) a); /* ok */
g((const int (*)[2]) b); /* ok */
g((const typeof(&b[0])) b); /* compiler complains */
}
$ gcc -o t t.c
t.c: In function ‘main’:
t.c:13:2: warning: passing argument 1 of ‘g’ from incompatible pointer type [enabled by default]
g((const typeof(&b[0])) b); /* compiler complains */
^
t.c:3:10: note: expected ‘const int (*)[2]’ but argument is of type ‘int (*)[2]’
void g(const int b[2][2]) {/*empty*/}
答案 0 :(得分:2)
是的,缺少用const
带有非const
参数的二维数组调用函数的可能性实际上是C规范中的一个缺陷。
要四处移动,请记住
void g(const int b[2][2]) {/*empty*/}
被重写为
void g(const int (*b)[2]) {/*empty*/}
因此,这会向您展示如何转换为const int (*)[2]
,这是指向2 double
数组的指针。
g( (const int (*)[2])b );
答案 1 :(得分:-1)
声明头中的const表示该函数不能更改参数的内容。它是调用者(编译器)和程序员的信息。因此,没有理由进行const类型转换然后调用该函数。这完全是多余的。