Ich habe Code, der unter GCC 4.8.4 gut kompiliert wurde. Ich habe kürzlich mein System aktualisiert und habe jetzt GCC 5.2.1, und ich bekomme eine Warnung über inkompatible Zeigertypen. Ich habe das Problem auf ein kleines Beispiel extrahiert, die den Fehler reproduziert:GCC Inkompatibler Zeigertyp mit typedef
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;
}
In dem realen Code, der typedef, die Funktionsdefinition und die Typumwandlung ist in einer Bibliothek außerhalb meiner Kontrolle sonst würde ich nur Korrigieren Sie den Cast und die passende Funktion. Hier ist die Botschaft, die ich aus dem Compiler erhalten:
$ 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
Die Notiz von gcc ist besonders beunruhigend, da es zugeben scheint, dass die beiden Typen identisch sind, aber es beschwert sich trotzdem.
Kompiliert ohne Probleme auf [GCC 5.2.0] (http://coliru.stacked-crooked.com/a/f7768e128db5462b) (und auch Clang 3.7.0). Ich lehne mich einem Compiler-Bug zu. – Quentin
Gut zu wissen, dass es unter 5.2.0 kompiliert wird, was die Versionsmöglichkeiten auf 5.2.1 beschränkt. – Gravatite
Was meinen Sie, wenn Sie "5.2.1" sagen? Diese Version ist noch nicht offiziell freigegeben: '' svn: URL 'svn: //gcc.gnu.org/svn/gcc/tags/gcc_5_2_1_release' existiert nicht'' –