使用const转换使用const矩阵参数调用c函数

时间:2015-07-11 22:58:25

标签: c matrix casting const

我试图使用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*/}

2 个答案:

答案 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类型转换然后调用该函数。这完全是多余的。