我有一些代码在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;
}
Run Code Online (Sandbox Code Playgroud)
在实际代码中,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
Run Code Online (Sandbox Code Playgroud)
来自gcc的说明特别令人不安,因为它似乎承认这两种类型是相同的,但无论如何它都会抱怨.
这里和其他地方的共识似乎是 GCC 对 const 和 typedef 做了一些意想不到的事情。我不知道意外情况是否一定等同于错误,但这需要 GCC 开发人员来确定。
我通过为函数调用定义一个宏来解决我的编译问题,该宏修复了库内不匹配的类型转换。我通常不喜欢修改库内部结构,但宏允许我不接触实际的库头并在我自己的代码中定义它,以便将来对其进行注释,并且该代码的测试覆盖率应该是一个合理的早期警告信号,如果底层库的变化方式使得宏会破坏一些东西。
这与其说是“解决”,不如说是“解决”,但任何进一步的见解可能都必须来自 GCC 开发人员。