#define UNUSED(X) (void)X

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


#define UNUSED(x) (void)x
...
void f(int var)
{
	UNUSED(var);
	...   /* в этой функции переменная var не используется */
}

Или в библиотеке HAL STM32


#define __HAL_RCC_GPIOC_CLK_ENABLE()   do { \
                                        __IO uint32_t tmpreg; \
                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\
                                        /* Delay after an RCC peripheral clock enabling */\
                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN);\
                                        UNUSED(tmpreg); \
                                      } while(0U)

В gcc-компиляторе параметр функции можно пометить атрибутом: __attribute__  ((unused)). Это означает что переменная возможно не будет использована в теле функции и компилятор не выдаст предупреждение.


void f(__attribute__ ((unused)) int var)
{
	...   /* в этой функции переменная var не используется */
}

В MSVC __attribute__ ((unused)) работать не будет

UNUSED работает только с базовыми типами переменных. Не работает с элементами массива и [скорей всего, не проверял] не работает с указателями.

Встречается конструкция #define UNUSED(x)  ((x)=(x)), которая должна поддерживаться любым компилятором, но её испрользование не рекомендуется.

В C++17 (в С не поддерживается) введён атрибут [[maybe_unused]] для переменных, которые используются только в assert (конструкциях, проверяющих произвольные данные в любом месте программы).


//-- старый код
auto result = f();
(void)result;         // подавляем предупреждение о неиспользуемой переменной
assert(result > 0);

//-- новый код
[[maybe_unused]] auto result = f();
assert(result > 0);