使用常量转换使用常量矩阵参数调用c函数
我试图使用const cast调用带有const矩阵参数的c函数,但找不到停止gcc编译器抱怨的语法。如果删除了所有“const”强制转换,下面的代码编译时不会有任何抱怨。问题类似于,但没有提供完全令人满意的解决方案。在下面的代码中,如果对g()的第一个调用有效,那么对g()的第二个调用也应该有效,因为它在语法上是相同的。但事实并非如此。首选第二个版本的g(),因为它不需要事先知道矩阵的类型使用常量转换使用常量矩阵参数调用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
/* 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]
,这是一个指向2double
数组的指针
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]
。