Почему некоторые флаги предупреждений GCC не относятся к языку C ++ и все же работают в C ++? - PullRequest
6 голосов
/ 14 июня 2019

Я изучал предупреждения, предлагаемые GCC, используя синтаксис gcc -Q --help=warning.(См. 3.2 Опции, контролирующие тип вывода , для получения более подробной информации об этом.)

Мне пришло в голову, что многие (109 из 250 с GCC версии 6.4.1) предупреждений не являютсяклассифицируется как C ++.Я имею в виду, что они не будут отображаться при выполнении ограниченного запроса gcc -Q --help=warning,c++.(Из любопытства 81 предупреждение не классифицируется ни как C ++, ни как C.)

Тем не менее, по крайней мере, некоторые из этих предупреждений работают в C ++.В качестве примера возьмем -Waggregate-return.(См. Его в Compiler Explorer .)

-Waggregate-return по умолчанию отключен, и я знаю, что он, вероятно, в любом случае бесполезен (см. Путаница в отношении цели /поведение -Waggregate-return? ).Тем не менее, это всего лишь пример, может быть, есть некоторые полезные флаги в тех же 109 случаях.

Итак, почему некоторые предупреждающие флаги GCC не принадлежат языку C ++ и все же работают в C ++?Какое здесь правило?

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Это ошибка в любой документации

   --help={class|[^]qualifier}[,...]
       Print (on the standard output) a description of the command-line options understood by the compiler that fit into all specified classes and qualifiers.  These are the
       supported classes:
       ...

       language
           Display the options supported for language, where language is the name of one of the languages supported in this version of GCC.

или реализация (я думаю, это последнее.) Так что давай, если хочешь, подай ошибку. Обязательно отправьте ссылку на отчет о проблеме здесь.

В частности, вы не видите Общее , например. независимые от языка опции, отмеченные флагом CL_COMMON. Однако вы видите опции, которые применяются к нескольким языкам, но не ко всем (например, если они имеют флаги CL_C и CL_CXX; CL_COMMON - это отдельный флаг, значение которого не состоит из значений отдельных языковых флагов).

Код, ответственный за это, около gcc/opts.c:1360:

print_filtered_help (unsigned int include_flags,
                    unsigned int exclude_flags,
                    unsigned int any_flags,
                    unsigned int columns,
                    struct gcc_options *opts,
                    unsigned int lang_mask)
                    unsigned int lang_mask)
  ...

  if (include_flags == 0
      || ((option->flags & include_flags) != include_flags))
    {
      if ((option->flags & any_flags) == 0)
        continue;
    }

(вызывающий передает 0 для any_flags, поэтому внутренняя проверка всегда проходит успешно; здесь дело не в этом.)

0 голосов
/ 17 июня 2019

Вдохновленный ответом Владислава Иванишина , главным образом концепция "общих" флагов, я сделал раздел предупреждений от GCC, который я использую (6.4.1):

  1. общий - 58
  2. C ++ - 141
  3. C - 133
  4. Объектив C - 135
  5. Объектив C ++ - 141
  6. Фортран - 36
  7. Ada - 2
  8. Go - 2
  9. Java - 5

Всего есть 250 сообщений, и все они покрыты одним или несколькими из вышеуказанных языков.Тем не менее, я не уверен, что это полный список поддерживаемых языков - я не знаю, как проверить, какие языки поддерживаются произвольной версией GCC.

* * * * * -Waggregate-return из вопроса принадлежитв «общую» категорию, поэтому он также предназначен для языка C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...