【发布时间】:2016-01-27 08:47:41
【问题描述】:
我有一些在 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 5.2.0 上顺利编译(以及 Clang 3.7.0)。我倾向于编译器错误。
-
很高兴知道它在 5.2.0 上编译,这绝对将版本可能性限制在 5.2.1。
-
你说“5.2.1”是什么意思?此版本尚未正式发布:
svn: URL 'svn://gcc.gnu.org/svn/gcc/tags/gcc_5_2_1_release' doesn't exist -
$ gcc --version gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010 版权所有 (C) 2015 Free Software Foundation, Inc. 这是免费软件;查看复制条件的来源。没有保修;甚至不是为了适销性或适合特定目的。
-
@MM,关于编译器版本毫无疑问,我对 Ubuntu 在他们的 15.10 版本中放置了一个未发布的 GCC 感到有点恼火,但为了讨论起见,让我们假设我对 Ubuntu 发布决策的控制非常少,但仍然需要在其中编译软件。 (-= 我刚刚尝试了 -std=c11 标志,它没有任何效果。无论如何,如果这是一个 gcc 错误,最好在它发布之前找到它,希望下一个 Ubuntu 版本,这将是LTS,将有一个固定的 gcc。如果发生这种情况,那么从长远来看,这种暂时的恶化是值得的。