Der folgende Code wird kompiliert und ausgeführt, aber ich erwarte eine Warnung beim Kompilieren:
%Vor%GCC, von einem Online-Compiler mit Kommandozeilenargument
%Vor%gibt die folgende Warnung aus, wenn
kompiliert wird %Vor% weil ich keine (void*)
Besetzung hinzugefügt habe bevor &x
als %p
erwartet ein Argument vom Typ void*
Aber wenn ich mit
oder
%Vor%oder
%Vor%GCC (in meinem PC) gibt nicht eine Warnung aus, während ich (wieder in meinem PC) mit
kompiliere %Vor%oder
%Vor%oder
%Vor%oder
%Vor%Ich bekomme die oben erwähnte Warnung. Warum ist es so? Meine GCC-Version ist 4.8.1 und ich verwende Windows. Ich kompiliere von der Konsole aus, d. H.% Co_de%.
Warum ist das so?
Erstens kann ich diesen inkonsistenten Zustand auch mit mingw32 gcc 4.8.1 auf meinem Rechner reproduzieren.
Obwohl die Diagnose vom C-Standard nicht benötigt wird (keine Einschränkung der Beschränkung), gibt es keinen Grund, dass gcc die Diagnose mit -std=gnu11
und nicht mit -std=c11
absetzt.
Außerdem erscheint mit gcc 4.8.2 unter Linux auf meinem Rechner die Diagnose mit -std=c11
und -std=gnu11
.
Es sieht also aus wie ein Fehler in gcc (entweder in gcc 4.8.1 oder in mingw32 gcc 4.8.1).
Dokumentation für beide GNU libc und C99 libc (Seite 315 der pdf ) sagt ausdrücklich, dass die Argument für %p
conversion "muss vom Typ void *
" sein.
Die Tatsache, dass die Warnung nicht ausgegeben wird, sollte eine Besonderheit dessen sein, was Ihr Compiler über Cxx-Standards denkt. Ein Lager gcc 4.8.2 auf Ubuntu 14.04 gibt die Warnung für alle sechs in Ihrem Beitrag erwähnten Standards aus.