Например:
Bool NullFunc(const struct timespec *when, const char *who)
{
return TRUE;
}
В C ++ я смог поместить /*...*/
комментарий вокруг параметров. Но не в C, конечно, где это дает мне ошибку error: parameter name omitted
.
c
gcc
gcc-warning
nixgadget
источник
источник
-Wno-unused-parameter
Просто слишком шумно и редко ловит баги особенно. когда-Wshadow
используется.Ответы:
Я обычно пишу такой макрос:
Вы можете использовать этот макрос для всех ваших неиспользуемых параметров. (Обратите внимание, что это работает на любом компиляторе.)
Например:
источник
void f(int x) {UNUSED(x);}
.#define UNUSED(...) (void)(__VA_ARGS__)
который позволяет мне применить это к нескольким переменным.В gcc вы можете пометить параметр
unused
атрибутом .На практике это достигается путем установки
__attribute__ ((unused))
непосредственно перед параметром. Например:становится
источник
__attribute__ ((unused))
перед аргументом.__attribute__((unused))
является частным расширением GCC . Это поддерживается некоторыми другими компиляторами, но я предполагаю, что это не будет работать с MSVC. Однако это не является частью стандарта компилятора, поэтому он не так переносим, как некоторые другие опцииВы можете использовать неиспользуемый атрибут gcc / clang, однако я использую эти макросы в заголовке, чтобы избежать специфичных для gcc атрибутов по всему источнику, а также
__attribute__
везде - немного многословно / безобразно.Тогда вы можете сделать ...
Я предпочитаю это, потому что вы получаете ошибку, если вы пытаетесь использовать
bar
код в любом месте, чтобы вы не могли оставить атрибут по ошибке.и для функций ...
Примечание 1):
Насколько я знаю, MSVC не имеет эквивалента
__attribute__((__unused__))
.Примечание 2): макрос не будет работать на аргументы , которые содержат круглые скобки, поэтому если у вас есть аргумент , как вы не можете сделать, или , это единственный недостаток в макро я нашел до сих пор, в этих случаях , я падаю назад в
UNUSED
float (*coords)[3]
float UNUSED((*coords)[3])
float (*UNUSED(coords))[3]
UNUSED
(void)coords;
источник
#define __attribute__(x)
для среды без GCC (AFAIK ни один из__attribute__
них не поддерживается MSVC)?warning: unused parameter ‘foo’ [-Wunused-parameter]
(gcc 7.3.0)С gcc с неиспользованным атрибутом:
источник
Видя, что это помечено как gcc, вы можете использовать переключатель командной строки
Wno-unused-parameter
.Например:
Конечно, это влияет на весь файл (и, возможно, проект в зависимости от того, где вы установили переключатель), но вам не нужно менять код.
источник
Специфичный способ gcc / g ++ для подавления предупреждения о неиспользованном параметре для блока исходного кода - заключить его в следующие прагматические выражения:
источник
Маркировка атрибута является идеальным способом. Макро приводит к путанице. и используя void (x), мы добавляем издержки при обработке.
Если не используется входной аргумент, используйте
Если не использовать переменную, определенную внутри функции
Теперь позже, используя хеш-переменную для вашей логики, но не нужно bkt. определить bkt как неиспользуемый, иначе компилятор говорит: «bkt set bt not used».
ПРИМЕЧАНИЕ. Это просто для того, чтобы отключить предупреждение, а не для оптимизации.
источник
void(x)
, компилятор оптимизирует их.У меня та же проблема. Я использовал библиотеку третьей части. Когда я компилирую эту библиотеку, компилятор (gcc / clang) будет жаловаться на неиспользуемые переменные.
Как это
Таким образом, решение довольно ясно. Добавление в
-Wno-unused
качестве gcc / clang CFLAG подавит все «неиспользуемые» предупреждения, даже если вы уже-Wall
установили.Таким образом, вам не нужно менять какой-либо код.
источник
В MSVC для подавления определенного предупреждения достаточно указать его номер для компилятора как / wd #. Мой CMakeLists.txt содержит такой блок:
Теперь я не могу сказать, что именно / wd4512 / wd4702 / wd4100 / wd4510 / wd4355 / wd4127 означают, потому что я не обращаю никакого внимания на MSVC в течение трех лет, но они подавляют сверхпедантические предупреждения, которые не влияют на результат.
источник
Я видел этот стиль используется:
источник
struct { int a; } b = {1}; if (b);
GCC предупреждаетused struct type value where scalar is required
.Для справки, мне нравится ответ Джоба выше, но мне любопытно найти решение, использующее только имя переменной в выражении «ничего не делать»:
Конечно, у этого есть недостатки; например, без «неиспользованного» примечания это выглядит скорее как ошибка, а не как преднамеренная строка кода.
Преимущество в том, что DEFINE не требуется, и это избавляет от предупреждения.
Есть ли производительность, оптимизация или другие различия?
источник