2015-01-03 12 views
8

Il seguente codice compilato ed eseguito, ma mi aspetto un avvertimento quando si compila:GCC non emette un avviso quando si compila

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

int main(void){ 

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

    return EXIT_SUCCESS; 
} 

GCC,from an online compiler con argomento della riga di comando

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

dà il seguente avviso quando compilazione

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); 

perché non ho aggiunto un (void*) gettato prima &x come %p si aspetta un argomento di tipo void* .Ma quando compilo usando

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

o

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

o

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

GCC (nel mio PC) non non emettere un avviso mentre compila (di nuovo nel mio PC) usando

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

o

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

o

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

o

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

ricevo l'avviso di cui sopra. Perché è così? La mia versione GCC è 4.8.1 e sto usando Windows. Compilo dalla console, cioè cmd.

+0

È mingw gcc, cygwin gcc o qualcos'altro? – ouah

+0

@ouah, non lo so esattamente, ma usando 'gcc -v' mostra' Target: mingw32'. Quindi suppongo che mingw gcc –

risposta

2

Perché è così?

Innanzitutto, posso anche riprodurre questo stato incoerente con mingw32 gcc 4.8.1 sulla mia macchina.

Mentre la diagnostica non è richiesta (nessuna violazione del vincolo) da parte dello standard C, non vi è alcun motivo per cui gcc invia la diagnostica con -std=gnu11 e non con -std=c11.

Inoltre con gcc 4.8.2 su Linux sulla mia macchina, la diagnostica viene visualizzata sia con -std=c11 e -std=gnu11.

Quindi sembra un bug in gcc (in gcc 4.8.1 o in mingw32 gcc 4.8.1).

+0

presumo che mingw manchi un '__attributo __ ((format (printf, 3,4))) nei file di intestazione stdio di mingw sulla dichiarazione printf() - senza di ciò, printf è solo un normale funzione varadica e nessun controllo di formato può essere fornito da -Wformat – nos

+1

@nos potrebbe essere ma la documentazione di gcc sull'attributo format dice che * Il compilatore sempre (a meno che non si usi -ffreestanding o -fno-builtin) controlli i formati per le funzioni di libreria standard printf, [...] ogni volta che tali avvertimenti sono richiesti (usando -Wformat), quindi non c'è bisogno di modificare il file di intestazione stdio.h * così sembra anche senza l'attributo che gcc dovrebbe avvertire. – ouah

+0

@ouah, questa domanda è correlata a [questa] (http://stackoverflow.com/questions/27363795/mingw-doesnt-produce-warnings)? –

0

documentazione sia per GNU libc e C99 libc (pagina 315 del pdf) dice esplicitamente che l'argomento per %p conversione "deve essere di tipo void *".

Il fatto che l'avviso non venga emesso dovrebbe essere una particolarità di ciò che il compilatore pensa degli standard Cxx. A magazzino gcc 4.8.2 su Ubuntu 14.04 emette l'avviso per tutti e sei gli standard menzionati nel tuo post.

Problemi correlati