使用常量转换使用常量矩阵参数调用c函数

使用常量转换使用常量矩阵参数调用c函数,c,matrix,casting,constants,C,Matrix,Casting,Constants,我试图使用const cast调用带有const矩阵参数的c函数,但找不到停止gcc编译器抱怨的语法。如果删除了所有“const”强制转换,下面的代码编译时不会有任何抱怨。问题类似于,但没有提供完全令人满意的解决方案。在下面的代码中,如果对g()的第一个调用有效,那么对g()的第二个调用也应该有效,因为它在语法上是相同的。但事实并非如此。首选第二个版本的g(),因为它不需要事先知道矩阵的类型 /* file t.c */ void f(const int a[2]) {/*empty*/} vo

我试图使用const cast调用带有const矩阵参数的c函数,但找不到停止gcc编译器抱怨的语法。如果删除了所有“const”强制转换,下面的代码编译时不会有任何抱怨。问题类似于,但没有提供完全令人满意的解决方案。在下面的代码中,如果对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*/}

声明头中的const表示函数无法更改参数的内容。它是调用方(编译器)和程序员的信息。因此,没有理由在调用函数时进行常量类型转换。这完全是多余的。

是的,使用非
const
参数调用带有
const
2D数组的函数的可能性不足,这在C规范中确实是一个缺陷

要在它周围移动,请记住

void g(const int b[2][2]) {/*empty*/}
被改写为

void g(const int (*b)[2]) {/*empty*/}
因此,这向您展示了如何将常量int(*)转换为
const[2]
,这是一个指向2
double
数组的指针

g( (const int (*)[2])b );

const-typeof(&b[0])
int(*const)[2]
,而不是
const-int(*)[2]
,即指针本身是常量,而不是元素。强制转换没有任何用处。您可以将函数调用为
f(a)
g(b)
。是的,您可以将函数调用为f(a)和g(b),一切都正常。问题只是编译器在抱怨。我有一个用常量参数调用库函数的大型代码。gcc会在编译过程中抱怨一些不应该出现的问题。如果不是因为编译器错误,这将是多余的。我不知道,是编译器做的。非常奇怪的行为。gcc错误消息还有助于记住如何编写类型:
应为“const int(*)[2]”,但参数的类型为“int(*)[2]”
这一切都是正确的。问题是int(*)[2])b应该与typeof(&b[0])相同(我认为),但编译器不识别它们是相同的。@ajsh,不,它应该与
typeof(&b)
相同,而不带
[0]