Подтвердить что ты не робот

Как подавить предупреждения "неиспользуемый параметр" в C?

Например:

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

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

4b9b3361

Ответ 1

Обычно я пишу макрос:

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

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

Например:

void f(int x) {
    UNUSED(x);
    ...
}

Ответ 2

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

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

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

void foo(workerid_t workerId) { }

становится

void foo(__attribute__((unused)) workerid_t workerId) { }

Ответ 3

Вы можете использовать неиспользуемый атрибут 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;

Ответ 4

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

int foo (__attribute__((unused)) int bar) {
    return 0;
}

Ответ 5

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

Например:

gcc -Wno-unused-parameter test.c

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

Ответ 6

Маркировка атрибута - идеальный способ. MACRO приводит к некоторой путанице. и используя 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. define bkt как неиспользуемый, иначе компилятор говорит "bkt set bt not used".

ПРИМЕЧАНИЕ. Это просто для предотвращения предупреждения не для оптимизации.

Ответ 7

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

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop

Ответ 8

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

Подобно этому

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

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

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

Таким образом, вам не нужно изменять какой-либо код.

Ответ 9

В 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 ()

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

Ответ 10

Я видел этот стиль используется:

if (when || who || format || data || len);

Ответ 11

Для записи мне нравится ответ на работу выше, но мне интересно, какое решение можно использовать, просто используя имя переменной в инструкции do-nothing:

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

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

Преимущество состоит в том, что никакой ОПРЕДЕЛЕНИЕ не требуется, и он избавляется от предупреждения.

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