Как работает флаг gcc -Wc90-c99-compat? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть код вроде

#include <stdio.h>
#include <stdbool.h>
main() {
    bool ok = true;
    printf("%u\n", ok);
}

, и я компилирую его как

gcc -std=c90 -Wc90-c99-compat a.c

, но я не получаю никаких предупреждений.

Iожидается какое-то предупреждение, поскольку bool не определено в C90 . В документации gcc говорится, что флаг -Wc90-c99-compat используется для

[w] arn о функциях, отсутствующих в ISO C90, но присутствующих в ISO C99.

Здесь вы можете попробовать сами .Моя версия gcc - 7.3.0, версия TIO - 8.1.1.

Я что-то делаю неправильно или что-то неправильно понимаю?

Обновление.Что-то вроде

#include <stdio.h>
main() {
    _Bool ok = 1;
    printf("%u\n", ok);
}

выдает предупреждение: предупреждение: ISO C90 не поддерживает логические типы . Попробуйте здесь .

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

gcc -std=c90 -Wc90-c99-compat -E a.c

, и соответствующая часть становится

main() {
    _Bool ok = 1;
     printf("%u\n", ok);
}

, нооб этом не возникло никаких ошибок.

Обновление.

Как и предполагали другие, я подал отчет об ошибке .

1 Ответ

0 голосов
/ 13 сентября 2018

[это больше комментарий, чем aswer; AFAICT это похоже на ошибку gcc, но кто-то может прийти с убедительным объяснением этого]

Ваш пример может быть уменьшен до:

# 2 "a.c" 3
main() {
    _Bool ok = 1;
}

С ошибкой (функцией?) В том, что cc -std=c90 -Wc90-c99-compat -Wsystem-headers не предупреждает о типе c99 _Bool, несмотря на параметр -Wsystem-headers.

3 в конце директивы строки препроцессора означает, что следующий за ним код взят из системного заголовка (см. Препроцессор c docs ) - и удаление 3 возвращает предупреждение о _Bool.

Если вы проверите вывод cc -E, вы увидите, что расширения макросов bool и true заключены в такие строки, поскольку они определены в системном заголовке (stdbool.h):

$ cat a.c
#include <stdbool.h>
main() {
    bool ok = true;
}
$ gcc -E a.c
...
main() {

# 3 "a.c" 3 4
   _Bool
# 3 "a.c"
        ok =
# 3 "a.c" 3 4
             1
# 3 "a.c"
                 ;
}
...