Предупредить при использовании параметра, помеченного как __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))
Когда объект фактически не используется, предупреждение отключается. Когда объект помечен этим макросом, но все еще используется, вы получите предупреждение об устаревании.