Макрос переносимого параметра UNUSED, используемый в сигнатуре функции для C и C ++ - PullRequest
34 голосов
/ 17 августа 2011

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

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

Независимый от компилятора способ реализации макроса UNUSED в C / 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) /*@unused@*/ x
#elif defined(__cplusplus)
# define UNUSED(x)
#else
# define UNUSED(x) x
#endif

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

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

Ответы [ 4 ]

22 голосов
/ 13 сентября 2013

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

#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.
}
9 голосов
/ 07 марта 2012

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

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

7 голосов
/ 10 ноября 2013

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

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

#define UNUSED(x) (void)x;

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

6 голосов
/ 17 августа 2011

Во многих компиляторах я использовал следующее, исключая поддержку 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 - стандартный префикс для этого проекта на основе языка Си. GNUC является соглашением от GLib для этого атрибута.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...