В чем смысл атрибута __unused в C?

У меня есть вопрос. Допустим, вы определяете функцию или переменную в C. Если вы ее не используете, компилятор выдает предупреждение о том, что эта переменная/функция не использовалась. Чтобы подавить предупреждение, вы используете атрибут перед объявлением. Если вам нужно это использовать, какой смысл объявлять функцию/переменную в первую очередь? Что хорошего в использовании __unused?

1 ответ

__unusedобычно это макрос, который расширяется до расширения языка C. Однако C23 даст нам [[maybe_unused]], и в стандарте есть пример:

ПРИМЕР

       [[maybe_unused]] void f([[maybe_unused]] int i) {
    [[maybe_unused]] int j = i + 100;
    assert(j);
}

Реализациям рекомендуется не диагностировать то, что не используется, независимо от того, определено оно или нет.

Это assert()макрос будет расширяться до нуля в NDEBUG, что означает, что компилятор будет думать, что он не используется.

Конечно, альтернативой этому было бы поставить весь jопределение (и, возможно, его использование) внутри #ifdef«блокировать», но в данном случае это было бы громоздко. Кроме того, если вы сделаете это, то iбудет тот, который не используется, и т. д.

Существуют и другие варианты использования, такие как неиспользуемые параметры функции, если вы хотите сохранить их имена и избежать (void)x;трюк, в некоторых случаях работа с запутанным оптимизатором/компилятором, внешнее использование символов, которые не видны компилятору/компоновщику, и т. д.

Другие вопросы по тегам