Переносимый макрос параметров 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, так и С++, и поэтому решение С++ не приемлемо.
Ответы
Ответ 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__
в определенных обстоятельствах, но, конечно же, ошибки.