Як вимкнути попередження про невикористану змінну, що виходять із gcc, у сторонній код, який я не хочу редагувати?


93

Я хотів би знати, який перемикач ви передаєте компілятору gcc, щоб вимкнути невикористані попередження змінних? У мене з’являються помилки з підсилення у Windows, і я не хочу торкатися коду підсилення:

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
Йоахім Ісакссон

Відповіді:


236

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

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

Наприклад, замість -IC:\\boost_1_52_0сказати -isystem C:\\boost_1_52_0.

Сподіваюся, це допоможе. Щасти!


Куди додати це налаштування? Це було зроблено в розділі "Налаштування проекту / Компілятор AVR GNU C / Різне", але він буде проігнорований (шлях правильний, все одно отримуватиме попередження). При додаванні цього до налаштувань каталогу (зніміть прапорець щодо відносного шляху) AtmelStudio вийде з ладу.
hfrmobile

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

1
Вам потрібно:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ронні Шерер

82

Іноді вам просто потрібно придушити лише деякі попередження, а ви хочете зберегти інші попередження, щоб бути в безпеці. У коді ви можете придушити попередження щодо змінних і навіть формальних параметрів, використовуючи невикористаний атрибут 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

66

Якщо ви використовуєте 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

@ vladislav-toncharov Ви маєте рацію щодо попереджень щодо компілятора. Але ми тут не говоримо про попередження компілятора - ми говоримо конкретно про GCC. Ви також маєте рацію щодо того, що #pragma не шкідлива для кожного слова. Однак багато людей в ІМО не знають, як правильно використовувати # pragma, і тому я вважаю це "небезпечним" (через відсутність кращих слів).
Dee'Kej

15

Див. Розділ man gccПараметри попередження. Там у вас ціла купаunused

Параметри попередження
...

Якщо до будь-якого з них no-поставити префікс , це попередження вимкне.

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

Більш детальне пояснення можна знайти в розділі « Параметри запиту та заборони попереджень»


Не знав, що я можу поставити префікс "ні-" з будь-якими попередженнями.
РНК

10

Використання -Wno-unused-variableмає спрацювати.


Ааа, невикористана змінна, не невикористана вартість!
WilliamKF

5
Або -Wno-error=unused-variableякщо ви хочете видалити помилку та зберегти попередження.
Оскар Н.

1
Ви насправді можете побачити, що таке фактичне попередження [-Werror=unused-variable].
Mats Petersson

3

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


3

Як вимкнути невикористані попередження змінної, що виходять із gcc?
У мене з’являються помилки з підсилення у Windows, і я не хочу торкатися коду посилення ...

Ви відвідуєте Boost's 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.