Предупредить при использовании параметра, помеченного как __unused

Используя флаг -Wunused-parameter, вы можете использовать __unused для неиспользуемых параметров в качестве оптимизации компилятора. Следующий код вызывает два предупреждения:

#include <stdio.h>
int main(int argc, char **argv) {
  printf("hello world\n");
  return 0;
}

Эти предупреждения исправляются путем добавления __unused неиспользуемых аргументов.

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world\n");
  return 0;
}

Когда вы используете параметр, помеченный __unused, clang 4.1 не предупреждает и не выдает ошибку.

#include <stdio.h>
int main(int __unused argc, char __unused **argv) {
  printf("hello world. there are %d args\n", argc);
  return 0;
}

Такое же поведение демонстрируется с помощью __attribute__((unused)),

int main(int __attribute__((unused)) argc, char __attribute__((unused)) **argv) {

Есть ли способ предупредить или ошибка на __unused? Что произойдет, если вы случайно оставите __unused для используемого параметра? В приведенном выше примере argc похоже, имеет правильное значение, хотя это может быть компилятор, не использующий подсказку, и я бы не стал полагаться на это поведение без дополнительного понимания.

3 ответа

Решение

__unused Атрибут предназначен для предотвращения жалоб, когда аргументы функций / методов или функций / методов не используются, а не для принудительного их неиспользования.

Термин, используемый в руководстве GCC:

Этот атрибут, прикрепленный к функции, означает, что эта функция, возможно, не используется

И для переменных:

Этот атрибут, прикрепленный к переменной, означает, что переменная, возможно, не используется.

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

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

Еще один способ снять шкуру с этого кота - удалить (или закомментировать) имя параметра.

int main ( int argc, char ** /* argv */ ) {
    printf("hello world. there are %d args\n", argc);
    return 0;
}

Теперь компилятор не будет предупреждать о argv быть неиспользованным, и вы не можете использовать его, потому что у него нет имени.

Вы можете использовать и unusedвместе для достижения желаемого поведения (спасибо Дитриху Эппу за упоминание deprecatedв своем комментарии):

      #define is_unused __attribute__((deprecated, unused))

Когда объект фактически не используется, предупреждение отключается. Когда объект помечен этим макросом, но все еще используется, вы получите предупреждение об устаревании.

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