Предупреждение: функция «F» не нужна и не будет выдана - PullRequest
3 голосов
/ 05 октября 2019

Вот небольшая программа ( в прямом эфире на Годболт ):

static void UnusedDeclaration ();
static void UnusedDefinition () {}
static void Declaration ();

decltype (Declaration ())*  global;

В идеале, я бы ожидал следующие предупреждения, если я скомпилирую его с помощью clang, -Wunused:

  1. UnusedDeclaration (): Это объявление неиспользуемой функции с внутренней связью. Поэтому я должен получить предупреждение.
  2. UnusedDefinition (): это определение неиспользуемой функции с внутренней связью. Поэтому я должен получить предупреждение.
  3. Declaration (): это объявление используется. Поэтому я должен не получить предупреждение.

На самом деле все три случая получают предупреждение:

warning: unused function 'UnusedDeclaration'
warning: unused function 'UnusedDefinition'
warning: function 'Declaration' is not needed and will not be emitted

У меня проблема с делом 3. Я думаю,, компилятор не должен предупреждать меня ни о чем, но это так.

  • Почему я получаю предупреждение для случая 3?
    • function 'Declaration' is not needed - Мне действительно нужна эта декларация. Я использую это в неоцененном контексте, компилятору не нужно жаловаться на это.
    • and will not be emitted - Я не уверен, что означает испускание. Я написал отдельный вопрос об этом.
  • Существует ли комбинация предупреждающих флагов для передачи компилятору в командной строке для достижения того, чего я ожидаю (предупреждение для случаев 1 и 2, предупреждение для случая 3).
  • Я мог бы отключить предупреждение для случая 3 с помощью -Wunused -Wno-unneeded-internal-declaration, но я не знаю, потеряю ли я какую-либо важную информацию с ним. Может быть, в некоторых других случаях это предупреждение полезно. В какой именно ситуации появляется это третье предупреждение?

1 Ответ

4 голосов
/ 05 октября 2019

Нет ссылки на первую функцию, поэтому ее можно игнорировать.

Вторая функция "вызывается", но, как вы заметили, только в неоцененном контексте. Это означает, что вызов никогда не будет оценен. Компилятор определяет тип, который функция вернула бы, если бы она была вызвана, но это все. Поскольку она никогда не вызывается, сама функция никогда не нужна и не используется как функция, поэтому компилятор не генерирует для нее никакого кода.

Сообщения отличаются, потому что, хотя конечный эффект тот же,каждый достигает этого результата немного по-своему, и компилятор пытается дать вам информацию, которая может быть полезна.

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