Как отключить предупреждения о неиспользуемых переменных, исходящие из gcc, в стороннем коде, который я не хочу редактировать?


94

Я хотел бы знать, какой переключатель вы передаете компилятору gcc, чтобы отключить предупреждения о неиспользуемых переменных? У меня возникают ошибки из-за повышения в окнах, и я не хочу касаться кода повышения:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Я попытался с помощью обоих -Wunused-valueи , -Wno-unused-valueно ни подавлено сообщения выше.

Какая правильная команда, вот моя строка компиляции:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Возможно, это -Wallпревосходит мою цель?


Как говорится в сообщении об ошибке, попробуйте-Werror=no-unused-variable
Йоахим Исакссон,

Ответы:


242

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

Я бы порекомендовал вам оставить предупреждение включенным, но использовать -isystemвместо него -Iдля включения каталогов сторонних проектов. Этот флаг указывает GCC не предупреждать вас о вещах, которые вы не контролируете.

Например, вместо -IC:\\boost_1_52_0, скажем -isystem C:\\boost_1_52_0.

Надеюсь, это поможет. Удачи!


Куда добавить эту настройку? Сделал это в разделе «Настройки проекта / AVR GNU C Compiler / Разное», но он будет проигнорирован (путь правильный, предупреждения все равно будут). При добавлении этого в настройки каталога (снимите флажок относительного пути) AtmelStudio выйдет из строя.
hfrmobile

3
у нас также есть -Wno-unused-parameterдля неиспользуемых параметров функции, -Wno-unused-functionдля неиспользуемой функции
Нго Тхань Нхан

1
Вам нужно:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ронни Шерер

84

Иногда вам просто нужно подавить только некоторые предупреждения, а другие вы хотите сохранить на всякий случай. В своем коде вы можете подавить предупреждения для переменных и даже формальных параметров, используя неиспользуемый атрибут GCC . Допустим, у вас есть этот фрагмент кода:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Может возникнуть ситуация, когда вам понадобится использовать эту функцию в качестве обработчика, что (imho) довольно часто встречается в библиотеке C ++ Boost. Тогда вам понадобится второй формальный параметр версия , чтобы сигнатура функции была такой же, как и в шаблоне, который требуется обработчику, иначе компиляция завершится неудачно. Но и в самой функции он вам не нужен ...

Решение, как пометить переменную или формальный параметр для исключения из предупреждений, следующее:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC имеет много других параметров, вы можете проверить их в страницах . Это также работает для программ на C, а не только для C ++, и я думаю, что это можно использовать почти во всех функциях, а не только в обработчиках. Давай, попробуй! ;)

PS: В последнее время я использовал это для подавления предупреждений о сериализации Boosts в шаблоне следующим образом:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

РЕДАКТИРОВАТЬ: По-видимому, я не ответил на ваш вопрос так, как вам нужно, drak0sha сделал это лучше. Это потому, что я в основном следил за названием вопроса, мое плохое. Надеюсь, это поможет другим людям, попавшим сюда из-за этого титула ... :)


7
Для формальных параметров вы можете опустить имя, например void func(unsigned number, const int). Тогда и gcc не будет жаловаться на неиспользуемые version.
Олаф Дитше

@OlafDietsche Я думаю, это зависит от gccверсии, которую вы используете. IIRC, мне пришлось использовать его 4 года назад, чтобы подавить предупреждения о неиспользуемых version. ;)
Dee'Kej

67

Если вы используете gcc и хотите отключить предупреждение для выбранного кода, вы можете использовать директиву компилятора #pragma:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Для кода, которым вы управляете, вы также можете использовать, __attribute__((unused))чтобы указать компилятору, что определенные переменные не используются.



В общем, я бы сказал, что использование директив #pragma не очень безопасно, если вы действительно не знаете, что делаете, или вы не используете, например, OpenMP для распараллеливания ...;)
Dee'Kej

1
#pragmaДирективы @ Dee'Kej совершенно безопасны, если их обернуть #ifdef some_compiler ... #endif. Предупреждения - это особенность компилятора, которая не определяется стандартом. Вы не можете подавить предупреждения из кода без #pragmas.
Kotauskas 08

@ vladislav-toncharov Вы правы насчет предупреждений, связанных с компилятором. Но мы не говорим здесь о предупреждениях компилятора в целом - мы говорим конкретно о GCC. Вы также правы, говоря, что #pragma не вредна. Однако многие люди в ИМО не знают, как правильно использовать #pragma, и поэтому я считаю это «опасным» (из-за отсутствия лучших слов).
Dee'Kej

15

См. Раздел « man gccПараметры предупреждений». Там у вас есть целая кучаunused

Параметры предупреждений
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

Если вы поставите перед любым из них префикс no-, это отключит это предупреждение.

Многие параметры имеют длинные имена, начинающиеся с -f или с -W --- например, -fmove-loop-invariants, -Wformat и так далее. Большинство из них имеют как положительные, так и отрицательные формы; отрицательная форма -ffoo будет -fno-foo. В этом руководстве описывается только одна из этих двух форм, в зависимости от того, какая из них не используется по умолчанию.

Более подробное объяснение можно найти в разделе «Параметры запроса или подавления предупреждений».


Не знал, что я могу поставить перед словом «нет-» какие-либо предупреждения.
RNA

10

Использование -Wno-unused-variableдолжно работать.


Ах, неиспользованная переменная, а не неиспользованное значение!
WilliamKF

5
Или, -Wno-error=unused-variableесли вы хотите удалить ошибку и оставить предупреждение.
Оскар Н.

1
Вы действительно можете увидеть, в чем заключается настоящее предупреждение [-Werror=unused-variable].
Матс Петерссон

3

Компилятор уже говорит вам, что это не valueно variable. Вы ищите -Wno-unused-variable. Также попробуйте g++ --help=warningsпросмотреть список доступных опций.


3

Как отключить предупреждения о неиспользуемых переменных из gcc?
Я получаю ошибки из-за повышения в окнах, и я не хочу трогать код повышения ...

Вы заходите на сайт Boost Trac и отправляете отчет об ошибке Boost.

Ваше приложение не несет ответственности за удаление предупреждений и ошибок библиотеки. Библиотека отвечает за очистку собственных предупреждений и ошибок.


0

-Wallи -Wextraустанавливает этап в GCC, и последующие -Wno-unused-variableмогут не вступить в силу. Например, если у вас есть:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

тогда GCC видит инструкцию -Wall -Wextraи, кажется, игнорирует-Wno-unused-variable

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

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Есть веская причина, по которой это называется «предупреждение» против «ошибки». Ошибка компиляции только из-за того, что ваш код не завершен (скажем, вы отключаете алгоритм), может привести к поражению.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.