Как подавить предупреждения «неиспользуемый параметр» в C? - PullRequest
188 голосов
/ 30 августа 2010

Например:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

В C ++ я смог добавить комментарий /*...*/ вокруг параметров.Но не в C, конечно, где это дает мне ошибку error: parameter name omitted.

Ответы [ 11 ]

268 голосов
/ 30 августа 2010

Я обычно пишу такой макрос:

#define UNUSED(x) (void)(x)

Вы можете использовать этот макрос для всех ваших неиспользуемых параметров. (Обратите внимание, что это работает на любом компиляторе.)

Например:

void f(int x) {
    UNUSED(x);
    ...
}
92 голосов
/ 30 августа 2010

В gcc вы можете пометить параметр с атрибутом unused .

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

На практике это достигается путем помещения __attribute__ ((unused)) непосредственно перед параметром.Например:

void foo(workerid_t workerId) { }

становится

void foo(__attribute__((unused)) workerid_t workerId) { }
54 голосов
/ 15 октября 2012

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

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

Тогда вы можете сделать ...

void foo(int UNUSED(bar)) { ... }

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

и для функций ...

static void UNUSED_FUNCTION(foo)(int bar) { ... }

Примечание 1):
Насколько я знаю, MSVC не имеет эквивалента __attribute__((__unused__)).

Примечание 2):
Макрос UNUSED не будет работать для аргументов, которые содержат круглые скобки,
, поэтому, если у вас есть аргумент, такой как float (*coords)[3], вы не можете сделать,
float UNUSED((*coords)[3]) или float (*UNUSED(coords))[3] , Это единственный недостаток макроса UNUSED, который я нашел до сих пор, в этих случаях я возвращаюсь к (void)coords;

16 голосов
/ 20 декабря 2013

С gcc с неиспользованным атрибутом:

int foo (__attribute__((unused)) int bar) {
    return 0;
}
8 голосов
/ 04 июля 2018

Видя, что это помечено как gcc, вы можете использовать переключатель командной строки Wno-unused-parameter.

Например:

gcc -Wno-unused-parameter test.c

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

5 голосов
/ 27 августа 2016

Специфичный способ gcc / g ++ для подавления предупреждения о неиспользуемом параметре для блока исходного кода - заключить его в следующие прагматические выражения:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop
5 голосов
/ 28 февраля 2014

Маркировка атрибута - идеальный способ.Макро иногда приводит к путанице.и используя void (x), мы добавляем издержки при обработке.

Если не используется входной аргумент, используйте

void foo(int __attribute__((unused))key)
{
}

Если не используется переменная, определенная внутри функции

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

Теперь позже, используя хеш-переменную для вашей логики, но не нужно bkt.определить bkt как неиспользуемый, в противном случае компилятор говорит: «bkt set bt не используется».

ПРИМЕЧАНИЕ. Это просто для того, чтобы отключить предупреждение, а не для оптимизации.

3 голосов
/ 20 января 2015

У меня такая же проблема.Я использовал библиотеку третьей части.Когда я компилирую эту библиотеку, компилятор (gcc / clang) будет жаловаться на неиспользуемые переменные.

Вот так

test.cpp: 29: 11: предупреждение: переменная 'магия' установлена, но не используется [-Wunused-but-set-variable] short magic [] ={

test.cpp: 84: 17: предупреждение: неиспользуемая переменная 'before_write' [-Wunused-variable] int64_t before_write = Thread :: currentTimeMillis ();

Итак, решениедовольно ясно.Добавление -Wno-unused в качестве gcc / clang CFLAG подавит все «неиспользуемые» предупреждения, даже если вы настроили -Wall.

Таким образом, вам НЕ НУЖНО изменять какой-либо код.

1 голос
/ 16 марта 2017

В MSVC для подавления определенного предупреждения достаточно указать его номер для компилятора в виде / wd #. Мой CMakeLists.txt содержит такой блок:

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

Теперь я не могу сказать, что именно означает / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127, потому что я не обращаю никакого внимания на MSVC в течение трех лет, но они подавляют сверхпедантические предупреждения, которые не влияют на результат.

0 голосов
/ 25 марта 2013

Кстати, мне нравится ответ Иова выше, но мне любопытно найти решение, использующее само имя переменной в выражении "ничего не делать":

void foo(int x) {
    x; /* unused */
    ...
}

Конечно, это имеет недостатки;например, без «неиспользованного» примечания это выглядит скорее как ошибка, а не как преднамеренная строка кода.

Преимущество в том, что DEFINE не требуется, и это избавляет от предупреждения.Есть ли какая-то производительность, оптимизация или другие различия?

...