У меня есть кроссплатформенное приложение, и в некоторых моих функциях используются не все значения, переданные функциям. Следовательно, я получаю предупреждение от GCC, говорящее мне, что есть неиспользуемые переменные.
Что было бы лучшим способом кодирования вокруг предупреждения?
#Ifdef вокруг функции?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Это так уродливо, но кажется, что компилятор предпочел бы.
Или я назначаю ноль переменной в конце функции? (что я ненавижу, потому что это изменяет что-то в потоке программы, чтобы заставить замолчать предупреждение компилятора).
Есть ли правильный путь?
c++
gcc
warnings
gcc-warning
Фил Ханнент
источник
источник
Q_UNUSED
макрос только для этого. Проверьте это в документации.Ответы:
Вы можете поместить это в "
(void)var;
" выражение (ничего не делает), чтобы компилятор увидел, что он используется. Это переносимо между компиляторами.Например
Или,
источник
Q_UNUSED
это реализовано в принципе.#define UNUSED(expr) (void)(expr)
должен работать тоже (без дел пока).template<typename... Args> void f(const Args&... args)
Я не могу писать(void)args;
или(void)args...;
потому , что оба являются синтаксическими ошибками.В GCC и Clang вы можете использовать
__attribute__((unused))
директиву препроцессора для достижения своей цели.Например:
источник
C ++ 17 теперь предоставляет
[[maybe_unused]]
атрибут.http://en.cppreference.com/w/cpp/language/attributes
Довольно красиво и стандартно.
источник
Ваше текущее решение лучше всего - закомментируйте имя параметра, если вы его не используете. Это относится ко всем компиляторам, поэтому вам не нужно использовать препроцессор, чтобы сделать это специально для GCC.
источник
g++
предупреждает об этом.) В таком случае, что бы вы порекомендовали?Обновление C ++ 17
В C ++ 17 мы получаем атрибут [[Maybe_unused]], который описан в [dcl.attr.unused]
Для следующего примера:
И clang, и gcc генерируют диагностику, используя -Wall -Wextra для bar и unused_bool ( смотрите в прямом эфире ).
При добавлении [[Maybe_unused]] отключается диагностика:
увидеть это в прямом эфире .
До C ++ 17
В C ++ 11 альтернативная форма
UNUSED
макроса может быть сформирована с использованием лямбда-выражения ( через Бен Дина ) с захватом неиспользуемой переменной:Немедленный вызов лямбда-выражения должен быть оптимизирован, учитывая следующий пример:
в Godbolt мы видим, что вызов оптимизирован:
источник
template <class T> inline void NOTUSED( T const & result ) { static_cast<void>(result); }
Вы также можете использовать лямбду в функции, я полагаю.[&x]{}()
на самом деле не отключает предупреждение, но вместо этого передает предупреждение от функции вызывающего к лямбде. Это займет время, пока компиляторы определят это как предупреждение, но clang-tidy уже жалуется на неиспользуемую переменную в списке захвата.Еще более простой способ - просто закомментировать имена переменных:
источник
#if 0 / #endif
комментарии блока.Коллега только что указал мне на этот хороший маленький макрос здесь
Для удобства я включу макрос ниже.
источник
НКУне помечает эти предупреждения по умолчанию. Это предупреждение должно быть включено либо явным образом путем передачи
-Wunused-parameter
компилятору, либо неявным образом путем передачи-Wall -Wextra
(или, возможно, какой-либо другой комбинации флагов).Предупреждения о неиспользованных параметрах можно просто подавить, передав
-Wno-unused-parameter
их компилятору, но имейте в виду, что этот флаг отключения должен идти после любых возможных флагов включения этого предупреждения в командной строке компилятора, чтобы оно могло вступить в силу.источник
бесполезный и переносимый способ объявить один или несколько параметров неиспользуемыми:
источник
Использование директив препроцессора в большинстве случаев считается злом. В идеале вы хотите избежать их, как вредителей. Помните, что заставить компилятор понять ваш код легко, а позволить другим программистам понять ваш код гораздо сложнее. Несколько десятков таких случаев здесь и там очень затрудняют чтение для вас самих или для других прямо сейчас.
Одним из способов может быть объединение ваших параметров в некоторый класс аргументов. Затем вы могли бы использовать только подмножество переменных (что на самом деле эквивалентно вашему назначению 0) или иметь разные специализации этого класса аргумента для каждой платформы. Однако это может не стоить того, вам нужно проанализировать, подходит ли оно.
Если вы можете прочитать невозможные шаблоны, вы можете найти дополнительные советы в книге «Исключительный C ++». Если бы люди, которые читали ваш код, могли использовать свои навыки для того, чтобы охватить сумасшедшие вещи, изложенные в этой книге, то у вас был бы прекрасный код, который также можно легко прочитать. Компилятор также будет хорошо осведомлен о том, что вы делаете (вместо того, чтобы скрывать все путем предварительной обработки)
источник
#define UNUSED(expr) (void)(expr)
уместным.Сначала предупреждение генерируется определением переменной в исходном файле, а не в заголовочном файле. Заголовок может оставаться чистым и должен, так как вы можете использовать что-то вроде doxygen для генерации API-документации.
Я предполагаю, что у вас совершенно другая реализация в исходных файлах. В этих случаях вы можете либо закомментировать параметр-нарушитель, либо просто записать параметр.
Пример:
Это может показаться загадочным, поэтому определил макрос как UNUSED. MFC сделал это так:
Таким образом, вы видите предупреждение, все еще в отладочных сборках, может быть полезно.
источник
Разве не безопасно всегда комментировать имена параметров? Если это не так, вы можете сделать что-то вроде
Это немного менее уродливо.
источник
Я видел это вместо
(void)param2
способа заставить замолчать предупреждение:Похоже, это было добавлено в C ++ 11
источник
Использование
UNREFERENCED_PARAMETER(p)
может работать. Я знаю, что он определен в WinNT.h для систем Windows и может быть легко определен и для gcc (если его еще нет).UNREFERENCED PARAMETER(p)
определяется какв WinNT.h.
источник
Используйте флаг компилятора, например, флаг для GCC:
-Wno-unused-variable
источник
Вы можете использовать,
__unused
чтобы сообщить компилятору, что переменная может не использоваться.источник
__unused
это не стандартный C ++, и, что более важно, ни то, что вы опубликовали ... Это Objective-C. Таким образом, этот ответ действительно полезен только для конкретных компиляторов, и он делает код непереносимым и фактически не действительным, поскольку пользовательский код не предназначен для использования идентификаторов, начинающихся с__
, которые зарезервированы для реализации.В C ++ 11 это решение, которое я использую:
Проверено на переносимость (по крайней мере, на современных msvc, clang и gcc) и не создает дополнительного кода при включенной оптимизации. Без оптимизации выполняется дополнительный вызов функции, и ссылки на параметры копируются в стек, но макросы не используются.
Если дополнительный код является проблемой, вы можете использовать это объявление вместо:
но в этот момент макрос обеспечивает лучшую читаемость:
источник
Это хорошо работает, но требует C ++ 11
источник
ALLCAPS
для чего-либо, кроме макросов, что делает их неприглядными и нежелательными, но в этом нет ничего плохого, кроме того, что astatic_cast
будет лучше.Я обнаружил, что большинство представленных ответов работают только для локальной неиспользуемой переменной и приведут к ошибке компиляции для неиспользуемой статической глобальной переменной.
Другой макрос должен был подавить предупреждение о неиспользуемой статической глобальной переменной.
Это работает, потому что не будет предупреждений о нестатической глобальной переменной в анонимном пространстве имен.
C ++ 11 требуется, хотя
источник
Ржунимагу! Я не думаю, что есть еще один вопрос о СО, который раскрывает всех еретиков, испорченных Хаосом, лучше, чем этот!
При всем уважении к C ++ 17 в C ++ Core Guidelines есть четкое руководство . AFAIR, еще в 2009 году эта опция была доступна так же, как и сегодня. И если кто-то говорит, что это считается ошибкой в Doxygen, то есть ошибка в Doxygen
источник
Я не вижу твоей проблемы с предупреждением. Запишите это в заголовок метода / функции, чтобы компилятор xy выдал (правильное) предупреждение, но эти переменные необходимы для платформы z.
Предупреждение правильное, отключать его не нужно. Это не лишает законной силы программу - но это должно быть задокументировано, что есть причина.
источник