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

Переносимый макрос параметров UNUSED, используемый для сигнатуры функции для C и С++

Я заинтересован в создании макроса для устранения предупреждения неиспользуемой переменной.

Этот вопрос описывает способ подавления предупреждения неиспользуемых параметров путем записи макроса внутри кода функции:

Универсальный независимый от компилятора способ реализации макроса UNUSED в C/С++

Но меня интересует макрос, который можно использовать в сигнатуре функции:

void callback(int UNUSED(some_useless_stuff)) {}

Это то, что я откопал с помощью Google (source)

#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@[email protected]*/ x
#elif defined(__cplusplus)
# define UNUSED(x)
#else
# define UNUSED(x) x
#endif

Может ли это быть дополнительно расширено для других компиляторов?

Изменить: для тех, кто не может понять, как работает тегирование: я хочу решение для C и С++. Вот почему этот вопрос отмечен как C, так и С++, и поэтому решение С++ не приемлемо.

4b9b3361

Ответ 1

После тестирования и последующих комментариев исходная версия, упомянутая в вопросе, оказалась достаточно хорошей.

Использование: #define UNUSED(x) __pragma(warning(suppress:4100)) x (упомянутое в комментариях) может потребоваться для компиляции C на MSVC, но это такая странная комбинация, что я не включил ее в конце.

Ответ 2

Как я это делаю:

#define UNUSED(x) (void)(x)
void foo(const int i) {
    UNUSED(i);
}

У меня не было проблем с Visual Studio, Intel, gcc и clang.

Другой вариант - просто прокомментировать параметр:

void foo(const int /*i*/) {
  // When we need to use `i` we can just uncomment it.
}

Ответ 3

Только одна маленькая вещь, лучше используя __attribute__((__unused__)) как __attribute__((unused)), потому что неиспользованный может быть где-то определен как макрос, лично у меня было несколько проблем с этой ситуацией.

Но трюк, который я использую, я нашел более читаемым:

#define UNUSED(x) (void)x;

Он работает, однако, только для переменных и аргументов методов, но не для самой функции.

Ответ 4

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

#if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
#       define PGM_GNUC_UNUSED         __attribute__((__unused__))
#else
#       define PGM_GNUC_UNUSED
#endif

Протестированные компиляторы: GCC, Clang, EKOPath, Intel C Compiler/Composer XE, MinGW32 на Cygwin/Linux/MSYS, MinGW-w64 на Cygwin/Linux, Sun ONE Studio/Oracle Solaris Studio, Visual Studio 2008/2010.

Пример использования:

pgm_tsc_init (
        PGM_GNUC_UNUSED pgm_error_t**   error
        )
{
...
}

PGM является стандартным префиксом для этого проекта на основе C. GNUC - это соглашение из GLib для этого атрибута.

Я думаю, что один компилятор предупреждает о __attribute__ в определенных обстоятельствах, но, конечно же, ошибки.