2013-02-24 7 views
71

Я хотел бы знать, какой коммутатор вы передаете компилятору gcc, чтобы отключить неиспользуемые предупреждения переменных? Я получаю ошибки из повышения на окнах, и я не хочу трогать код наддува:Как отключить неиспользуемые предупреждения переменных, выходящие из 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 переопределяет моя цель?

+0

Как более или менее сообщение об ошибке, попробуйте '-Werror = no-unused-variable' –

ответ

182

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

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

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

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

+40

+1 для -системы, очень полезно –

+0

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

+1

Вау, я рад узнать об isystem. Фантастика. – Spacemoose

9

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

+0

Ahh, unused-variable, not unused-value! – WilliamKF

+2

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

+1

Фактически вы можете видеть, какое фактическое предупреждение «[-Werror = unused-variable]». –

3

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

11

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

Варианты предупреждения
... -Wunused -Wunused-функция -Wunused-метка -Wunused-параметр -Wunused значение -Wunused-переменной -Wunused-но-комплект- параметр -Независимая переменная

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

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

Более подробное описание можно найти на сайте Options to Request or Suppress Warnings

+0

Не знал, что я могу префикс «no-» с любыми предупреждениями. – RNA

-3

Удалите -Wall, и он должен работать. Проблема с удалением -Wall - это также подавляет законные предупреждения. Вам придется вручную выбрать опции -W в этом случае или изменить на -Wno-unused-variable, как только у вас появятся все предупреждения.

LOCAL_CFLAGS = -Wno-unused-variable -g 
+2

Эта информация уже существует в предыдущих ответах. – GManNickG

-3
export IGNORE_WARNINGS=1 

Это делает предупреждение дисплея, но продолжает со сборкой

51

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

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

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

+1

Это по модулю несколько ошибок GCC: [Ошибка C++/53431: препроцессор C++ игнорирует диагностику #pragma GCC] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431); [Ошибка C++/66943: GCC предупреждает о Unknown Pragma для OpenMP, даже если он поддерживает его] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66943) и друзей. – jww

+0

В исходном коде C это не сработало. – peterh

+0

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

55

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

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

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

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

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

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

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

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

EDIT: Видимо, я не ответил на ваш вопрос, как вам нужно, drak0sha сделать это лучше , Это потому, что я в основном следил за заголовком вопроса, я плохо. Надеюсь, это поможет другим людям, которые попадают сюда из-за этого названия ... :)

+0

Тем не менее, это именно то, что я искал. Thx :) –

+6

Для формальных параметров вы можете опустить имя, например. 'void func (unsigned number, const int)'. Затем gcc также не будет жаловаться на неиспользуемую «версию». –

1

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

Вы посещаете Boost's Trac и подать отчет об ошибке в Boost.

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