[英]GCC Incompatible pointer type using a typedef
我有一些在GCC 4.8.4下可以很好编译的代码。 我最近升级了系统,现在安装了GCC 5.2.1,并且收到有关不兼容的指针类型的警告。 我已将问题提取到一个重现该错误的小示例中:
typedef const double ConstSpiceDouble;
void foo(const double (*)[3]);
int main(int argc, char **argv) {
double a[3][3] = {{1,2,3},{1,2,3},{1,2,3}};
foo((ConstSpiceDouble (*)[3])a);
return 0;
}
在实际代码中,typedef,函数定义和类型强制转换位于控件之外的库中,否则我将只修复强制转换和函数以使其匹配。 这是我从编译器得到的消息:
$ gcc -Werror -c test.c
test.c: In function ‘main’:
test.c:9:7: error: passing argument 1 of ‘foo’ from incompatible pointer type [-Werror=incompatible-pointer-types]
foo((ConstSpiceDouble (*)[3])a);
^
test.c:4:6: note: expected ‘const double (*)[3]’ but argument is of type ‘const ConstSpiceDouble (*)[3] {aka const double (*)[3]}’
void foo(const double (*)[3]);
^
cc1: all warnings being treated as errors
gcc的注释尤其令人不安,因为它似乎承认这两种类型是相同的,但无论如何还是会抱怨。
在这里和其他地方的共识似乎是,GCC正在使用const和typedef做意外的事情。 我不知道意外的情况一定会导致bug,但这是由GCC开发人员确定的。
我通过为函数调用定义一个宏来解决了我的编译问题,该函数调用修复了库中不匹配的类型转换。 我通常不喜欢修改库的内部结构,但是宏允许我不要触摸实际的库头,而是在自己的代码中定义它,以便将来对其进行注释,并且如果可能,对该代码的测试覆盖应该是一个合理的预警信号基础库的更改方式使宏破坏了工作。
这与其说是“解决”,不如说是“解决”的,但是任何进一步的见解可能都必须来自GCC开发人员。
如果将强制类型'a'键入为ConstSpiceDouble,则GCC会对const和typedef进行意外操作,最终类型将变为'const const double'。 您可以在错误消息 “ const ConstSpiceDouble”中看到该错误 ,它等同于“ const const double”,这是行不通的。
解决方案是在将foo函数参数化为'a'之前说'a'为const double或说'a'为ConstSpiceDouble
typedef const double ConstSpiceDouble;
void foo(const double (*)[3]);
int main(int argc, char **argv) {
const double a[3][3] = {{1,2,3},{1,2,3},{1,2,3}};
// or ConstSpiceDouble a[3][3] = {{1,2,3},{1,2,3},{1,2,3}};
foo(a);
return 0;
}
'const'前置似乎是最新版本的gcc的新功能,但是我不确定:(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.