2015-01-03 20 views
8

Der folgende Code kompiliert und ausgeführt Kompilieren aber ich erwarte eine Warnung beim Kompilieren:GCC emittieren keine Warnung, wenn

#include <stdio.h> 
#include <stdlib.h> 

int main(void){ 

    int x = 10; 
    printf("%p\n",&x); 

    return EXIT_SUCCESS; 
} 

GCC,from an online compiler mit Kommandozeilenargument

-Wall -std=gnu99 -O2 -o a.out source_file.c -pedantic -Wextra 

die folgende Warnung ausgibt, wenn Kompilieren

source_file.c: In function ‘main’: 
source_file.c:7:3: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int *’ [-Wformat=] 
    printf("%p\n",&x); 

weil ich keine (void*) hinzugefügt habe werfen, bevor &x als %p erwartet ein Argument vom Typ void* .Aber wenn ich

gcc SO.c -o so -Wall -Wextra -pedantic -std=c11 

oder

gcc SO.c -o so -Wall -Wextra -pedantic -std=c99 

oder

gcc SO.c -o so -Wall -Wextra -pedantic -std=c89 

GCC kompilieren (in meinem PC) tut nicht geben eine Warnung während kompilieren (wieder in meinem PC) mit

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu11 

oder

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu99 

oder

gcc SO.c -o so -Wall -Wextra -pedantic -std=gnu89 

oder

gcc SO.c -o so -Wall -Wextra -pedantic 

Ich erhalte die Warnung oben erwähnt. Warum ist es so? Meine GCC-Version ist 4.8.1 und ich verwende Windows. Ich kompiliere von der Konsole, d. H. cmd.

+0

Ist es mingw gcc, cygwin gcc oder etwas anderes? – ouah

+0

@ouah, ich weiß es nicht genau, aber die Verwendung von 'gcc -v' zeigt' Target: mingw32'. Also nehme ich an, dass sein mingw gcc –

Antwort

2

Warum ist das so?

Erstens kann ich diesen inkonsistenten Zustand auch mit mingw32 gcc 4.8.1 auf meinem Rechner reproduzieren.

Während die Diagnose vom C-Standard nicht erforderlich ist (keine Einschränkung der Beschränkung), gibt es keinen Grund, dass gcc die Diagnose mit -std=gnu11 und nicht mit -std=c11 ausgibt.

Außerdem mit gcc 4.8.2 unter Linux auf meinem Rechner, erscheint die Diagnose mit -std=c11 und -std=gnu11.

So sieht es aus wie ein Fehler in gcc (entweder in gcc 4.8.1 oder in mingw32 gcc 4.8.1).

+0

Ich nehme an, mingw fehlt ein '__attribute __ ((format (printf, 3,4)))' in den stdio-Header-Dateien von mingw auf der printf() -Deklaration - ohne das ist printf nur ein Normale Varadic-Funktion, und keine Formatprüfung kann von -Wformat – nos

+1

@Nos bereitgestellt werden, aber GCC-Dokumentation des Format-Attributs besagt, dass * Der Compiler immer (sofern nicht -freeprend oder -fno-builtin verwendet wird) prüft Formate für die Standard-Bibliothek Funktionen printf, wenn solche Warnungen angefordert werden (mit -Wformat), so dass es nicht notwendig ist, die Headerdatei stdio.h * zu ändern, so scheint es auch ohne das Attribut gcc sollte warnen. – ouah

+0

@ouah, Ist diese Frage zu [diesem] (http://stackoverflow.com/questions/27363795/mingw-doesnt-produce-warnings)? –

0

Dokumentation sowohl für GNU libc und C99 libc (Seite 315 der pdf) sagt ausdrücklich, dass das Argument für %p Umwandlung „vom Typ void * sein muss“.

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.

Verwandte Themen