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

Со страницы руководства install:

-c      Copy the file.  This is actually the default.  The -c option is only included for backwards compatibility.

Я думаю, что он демонстрирует одинаковое поведение для копирования файлов и создания каталогов. Кроме того, взгляните на https://github.com/NagiosEnterprises/nagioscore/blob/master/Makefile.in#L37-L39 и https://github.com/NagiosEnterprises/nagioscore /blob/master/Makefile.in#L415-L421 мы видим, что они устанавливаются скриптом ./configure.

Взглянув на configure.ac, мы видим, что макросы autoconf по умолчанию определяют используемый двоичный файл: https://github.com/NagiosEnterprises/nagioscore/blob/master/configure.ac#L17 -L19 . И это Nagios специально для установки $(COMMAND_OPTS): https://github.com/NagiosEnterprises/nagioscore/blob/master/configure.ac#L237-L240 .

Надеюсь, это поможет!

TL; DR: Это реликвия и не имеет значения:)

212
задан Jim Fell 6 June 2018 в 03:53
поделиться

10 ответов

Вы можете поместить его в выражение « (void) var; » (ничего не делает), чтобы компилятор увидел, что оно используется. Это переносимо между компиляторами.

Например,

void foo(int param1, int param2)
{
    (void)param2;
    bar(param1);
}

Или,

#define UNUSED(expr) do { (void)(expr); } while (0)
...

void foo(int param1, int param2)
{
    UNUSED(param2);
    bar(param1);
}
296
ответ дан 23 November 2019 в 04:29
поделиться

Я видел это вместо (void)param2 способ заставить предупреждение замолчать:

void foo(int param1, int param2)
{
    std::ignore = param2;
    bar(param1);
}

Похож, это было добавлено в C++ 11

1
ответ дан 23 November 2019 в 04:29
поделиться

Использование UNREFERENCED_PARAMETER (p) может работать. Я знаю, что он определен в WinNT.h для систем Windows и может быть легко определен и для gcc (если он еще не установлен).

НЕДОПУСТИМЫЙ ПАРАМЕТР (p) определяется как

#define UNREFERENCED_PARAMETER(P)          (P)

в WinNT.h.

3
ответ дан 23 November 2019 в 04:29
поделиться

Не безопасно ли всегда закомментировать имена параметров? Если это не так, вы можете сделать что-нибудь вроде

#ifdef _MSC_VER
# define P_(n) n
#else
# define P_(n)
#endif

void ProcessOps::sendToExternalApp(
    QString sAppName, QString sImagePath,
    qreal P_(qrLeft), qreal P_(qrTop), qreal P_(qrWidth), qreal P_(qrHeight))

Это немного менее уродливо.

4
ответ дан 23 November 2019 в 04:29
поделиться

Я не вижу вашей проблемы с предупреждением. Укажите в заголовке метода / функции, что компилятор xy выдаст здесь (правильное) предупреждение, но эти переменные необходимы для платформы z.

Предупреждение правильное, отключать его не нужно. Это не делает программу недействительной - но это должно быть документально подтверждено, что на это есть причина.

-13
ответ дан 23 November 2019 в 04:29
поделиться

Во-первых, предупреждение генерируется определением переменной в исходном файле, а не в файле заголовка. Заголовок может оставаться нетронутым и должен, поскольку вы можете использовать что-то вроде doxygen для создания документации API.

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

Пример:

func(int a, int b)
{
    b;
    foo(a);
}

Это может показаться загадочным, поэтому определен макрос вроде UNUSED. MFC сделал это следующим образом:

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif

Вы видите, что предупреждение все еще находится в отладочных сборках, может быть полезно.

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

Пример:

func(int a, int b)
{
    b;
    foo(a);
}

Это может показаться загадочным, поэтому определен макрос вроде UNUSED. MFC сделал это следующим образом:

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif

Как это вы видите, предупреждение все еще находится в отладочных сборках, может быть полезно.

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

Пример:

func(int a, int b)
{
    b;
    foo(a);
}

Это может показаться загадочным, поэтому определен макрос вроде UNUSED. MFC сделал это следующим образом:

#ifdef _DEBUG
#define UNUSED(x)
#else
#define UNUSED(x) x
#endif

Как это вы видите, предупреждение все еще находится в отладочных сборках, может быть полезно.

7
ответ дан 23 November 2019 в 04:29
поделиться

Ваше текущее решение является лучшим - закомментируйте имя параметра, если вы его не используете. Это применимо ко всем компиляторам, поэтому вам не нужно использовать препроцессор, чтобы сделать это специально для GCC.

38
ответ дан 23 November 2019 в 04:29
поделиться

В GCC и Clang вы можете использовать директиву препроцессора __ __ ((unused)) для достижения ваша цель.
Например:

int foo (__attribute__((unused)) int bar) {
   return 0;
}
93
ответ дан 23 November 2019 в 04:29
поделиться

В большинстве случаев использование директив препроцессора считается злом. В идеале вы хотите избегать их, как вредителя. Помните, что заставить компилятор понять ваш код легко, а позволить другим программистам понять ваш код намного сложнее. Несколько десятков подобных случаев тут и там делают очень трудным чтение для себя позже или для других прямо сейчас.

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

Если вы умеете читать невозможные шаблоны, вы можете найти дополнительные советы в книге «Исключительный C ++». Если бы люди, которые читали ваш код, могли бы получить свой набор навыков, позволяющий охватить сумасшедшие вещи, изложенные в этой книге, у вас был бы красивый код, который также можно было бы легко прочитать. Компилятор также будет хорошо осведомлен о том, что вы делаете (вместо того, чтобы скрывать все с помощью предварительной обработки)

8
ответ дан 23 November 2019 в 04:29
поделиться

Сотрудник только что указал мне на этот красивый маленький макрос здесь

Для простоты я включу макрос ниже.

#ifdef UNUSED
#elif defined(__GNUC__) 
# define UNUSED(x) UNUSED_ ## x __attribute__((unused)) 
#elif defined(__LCLINT__) 
# define UNUSED(x) /*@unused@*/ x 
#else 
# define UNUSED(x) x 
#endif

void dcc_mon_siginfo_handler(int UNUSED(whatsig))
24
ответ дан 23 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: