Как я могу скрыть «определенные, но не используемые» предупреждения в GCC? - PullRequest
59 голосов
/ 22 декабря 2008

У меня есть куча утверждений времени компиляции, таких как:

CASSERT(isTrue) or CASSERT2(isTrue, prefix_)

При компиляции с GCC я получаю много предупреждений, таких как 'prefix_LineNumber' defined but not used. Есть ли способ, которым я могу скрыть предупреждения для утверждений времени компиляции? Мне не повезло в поисках документации GCC. Я думал, что я мог бы автоматически использовать var внутри того же макроса, но не мог придумать, как это сделать.

Кто-нибудь знает способ скрыть это предупреждение в GCC?

Ответы [ 8 ]

93 голосов
/ 04 марта 2009

Только что видел эту ветку во время поиска решения этой проблемы. Я публикую здесь для полноты решения, которое я нашел ...

Флажок компилятора GCC, управляющий неиспользуемыми предупреждениями , включает:

-Wunused-function
-Wunused-label
-Wunused-parameter
-Wunused-value
-Wunused-variable
-Wunused (=all of the above)

Каждый из них имеет соответствующую отрицательную форму с "no-", вставленным после W, что отключает предупреждение (например, если оно было включено -Wall). Таким образом, в вашем случае вы должны использовать

-Wno-unused-function

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

46 голосов
/ 22 декабря 2008

Решение для GCC, не вызывающее конфликтов с другими компиляторами

#ifdef __GNUC__
#define VARIABLE_IS_NOT_USED __attribute__ ((unused))
#else
#define VARIABLE_IS_NOT_USED
#endif

int VARIABLE_IS_NOT_USED your_variable;
32 голосов
/ 27 декабря 2008

Вы можете создать пустой оператор и привести результат к void. Это переносимо во всех компиляторах, и gcc не выдаст вам никаких предупреждений, даже если включены -Wall и -Wextra. Например:

int var;    // var is not used
(void)var;  // null statement, cast to void -- suppresses warning

Обычная техника - создать для этого макрос:

#define UNUSED(x) ((void)(x))

int var;
UNUSED(var);
30 голосов
/ 13 мая 2011

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

К счастью, это предупреждение не касается встроенных функций.

inline static foo()
{
}
6 голосов
/ 05 марта 2015
#define UNUSED_VAR     __attribute__ ((unused))

для любой переменной просто используйте приведенный выше макрос перед его типом, например:

UNUSED_VAR int a = 2;
3 голосов
/ 27 декабря 2008

Трудно ответить, не зная деталей ваших макросов статического утверждения. Возможно, вы могли бы перейти на другой макрос, чтобы избежать этой проблемы? Вы можете добавить атрибут «unused» в макрос, как было предложено, или использовать другую форму CASSERT ().

Вот описания нескольких альтернатив:

http://www.jaggersoft.com/pubs/CVu11_3.html

http://blog.kowalczyk.info/kb/compile-time-asserts-in-c.html

http://www.pixelbeat.org/programming/gcc/static_assert.html

2 голосов
/ 22 декабря 2008

Как насчет -Wunused-label?

1 голос
/ 10 декабря 2018

Оберните эту функцию следующими директивами Весь код, который будет помещен между push и pop, не предупредит вас о неиспользуемых функциях. На весь остальной код (внешний push и pop) это не повлияет.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function"

... your code

#pragma GCC diagnostic pop
...