2015-01-03 4 views
8

Следующий код компилируется и работает, но я ожидаю предупреждение при компиляции:НКУ не выдавать предупреждение при компиляции

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

int main(void){ 

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

    return EXIT_SUCCESS; 
} 

GCC,from an online compiler с аргументом командной строки

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

выдает следующее предупреждение при компиляция

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

потому что я не добавил (void*) отбрасывать перед тем, как &x%p ожидает аргумент типа void* .Но когда я компилирую с помощью

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

или

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

или

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

GCC (в моем компьютере) делает не выдают предупреждение, тогда как компиляция (снова на моем ПК) с использованием

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

или

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

или

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

или

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

Я получаю предупреждение, упомянутых выше. Почему так? Моя версия GCC - 4.8.1, и я использую Windows. Я компилирую с консоли, т. Е. cmd.

+0

Это mingw gcc, cygwin gcc или что-то еще? – ouah

+0

@ouah, я не знаю точно, но используя 'gcc -v' показывает' Target: mingw32'. Поэтому я предполагаю, что его mingw gcc –

ответ

2

Почему это так?

Во-первых, я также могу воспроизвести это несогласованное состояние с mingw32 gcc 4.8.1 на моей машине.

В то время как диагностика не требуется (без нарушения ограничений) по стандарту C, нет причины, по которой gcc выдает диагностику с помощью -std=gnu11, а не с -std=c11.

Кроме того, с gcc 4.8.2 на Linux на моей машине диагностика отображается как с -std=c11, так и с -std=gnu11.

Так что это похоже на ошибку в gcc (либо в gcc 4.8.1, либо в mingw32 gcc 4.8.1).

+0

Я предполагаю, что mingw не имеет '__attribute __ ((format (printf, 3,4)))' в файлах заголовка stdio mingw в объявлении printf() - без этого printf - это просто нормальная варадическая функция, и никакая проверка формата не может быть предоставлена ​​-Wformat – nos

+1

@nos может быть, но gcc документация атрибута формата говорит, что * Компилятор всегда (если используется -ffreestanding или -fno-builtin) проверяет форматы для стандартных функций библиотеки printf, [...], когда такие предупреждения запрашиваются (с использованием -Wformat), поэтому нет необходимости изменять файл заголовка stdio.h *, поэтому кажется, что даже без атрибута gcc следует предупреждать. – ouah

+0

@ouah, Этот вопрос связан с [этим] (http://stackoverflow.com/questions/27363795/mingw-doesnt-produce-warnings)? –

0

Документация для обоих GNU libc и C99 LibC (стр 315 pdf) явно говорит о том, что аргумент для %p преобразования «должен быть типа void *».

Тот факт, что предупреждение не выдается, должно быть особенностью того, что ваш компилятор думает о стандартах Cxx. Акция gcc 4.8.2 на Ubuntu 14.04 выдает предупреждение для всех шести стандартов, упомянутых в вашем сообщении.