«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Неиспользуемые переменные в C/C ++: почему и как?

Неиспользуемые переменные в C/C ++: почему и как?

Опубликовано в 2025-02-06
Просматривать:429

Unused variables in C/C  : why and how?

При просмотре кода C/C мы довольно часто находим переменные, которые никогда не используются. Такие неиспользованные переменные возникают по разным причинам. В этом посте мы рассмотрим некоторые из наиболее распространенных причин, почему неиспользованные переменные встречаются в коде C/C. Мы рассмотрим, как заставить компилятор предупредить об неиспользованных переменных и как подавить предупреждения о конкретных неиспользованных переменных.

]

] Почему переменные не используются

]

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

]
    ]
  1. ошибки и ошибки : Наиболее очевидной причиной неиспользованной переменной является ошибочный код. Либо переменная действительно вообще не нужна и может быть удалена, либо переменная необходима, но мы забыли использовать ее в некоторых критических точках.

  2. ]
  3. Refactoring: как программное обеспечение записано и переписано, целые разделы кода могут быть удалены. Переменные, которые когда -то были жизненно важны для кода, такие как результаты вспомогательных вычислений, могут затем оставаться позади, неиспользованные.

  4. ]
  5. Future-Profbing: неиспользованные переменные могут возникнуть не только как наследие прошлого кода, но и как наследие будущего кода. Вы можете объявить переменные в ожидании кода, который еще не записан.

  6. ]
  7. условное компиляция: переменные могут оставаться неиспользованными в зависимости от фазы препроцессора. Стандартным примером является переменная, которая определяется только для целей отладки. Ваш код может содержать что -то из формы
    ]

  8. ]
]
const auto value = compute_some_value();
const auto value_for_comparison_only = compute_same_value_differently();
assert( value == value_for_comparison_only );
]

Если вы компилируете с -dndebug, то компилятор может предупредить вас, что value_for_comparison_only никогда не используется: Действительно, утверждение Assert было заменено на… ничего.

]

] Как обнаружить неиспользованные переменные

]

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

]

Например, GCC и Clang оснащены флагом -wunused -viable, который запускает предупреждения об неиспользованных переменных. Флаг уже подразумевается вариантом предупреждения -wall, и его можно отключить через wno -un -unused -viable.

]

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

]

] Как не обнаружить неиспользованные переменные: атрибуты

]

, в то время как мы всегда должны компилировать с таким количеством предупреждений, которые позволяются, как это возможно, существуют обстоятельства, когда мы хотим выборочно отключить предупреждения о конкретных неиспользованных переменных. Популярный способ сделать это - актерский состав:
]

]
Object unused_object;
(void)unused_object;
]

подсчет облигации как (Pro Forma) Использование переменной, поэтому никакого предупреждения не будет выпущено.

]

, в то время как это удаляет предупреждения о том, что unare_object не используется, как и предполагалось, есть способы улучшить это. Мы хотели бы иметь явную семантику, которую эта пустота означает неиспользованный объект. Общим способом является определение макроса:
]

]
#define UNUSED(x) (void)(x);
// ...
Object unused_object;
UNUSED(unused_object);
]

одно преимущество заключается в том, что теперь мы явно сообщаем о намерениях (или ее отсутствии) этой переменной. Более того, если мы решим очистить код неиспользованных переменных, то поиск их намного проще.

, выходя за рамки макросов, у нас есть переменные атрибуты: либо родные для языка C, либо как расширение языка, предоставленное компиляторами C/C. Например, Clang и GCC разрешают атрибут переменной __attribute __ ((неиспользованный)). C 17 поддерживает атрибут [[возможно ,_unused]]:
]

]
Object unused_object2 __attribute__((unused)) = x;  // should be placed after declaration
[[maybe_unused]] Object unused_object1 = x;         // must be placed before declaration
]

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

]

Исторически, сначала появились атрибуты GCC, были специфическими для компилятора расширения языка в C и C. С 17 атрибуты являются частью языкового стандарта. Однако не только написание отличается, но и расширения стандарта и GCC не согласны, где разместить атрибут.

]

атрибут [[wally_unused]] найдет большинство своих приложений с условным компиляцией. Например, это естественный атрибут для переменных только отладки. По чисто эстетическим причинам я лично предпочитаю определить макрос #define wally_unused [[возможно ,_unused]].

]

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

]

] Сохранить бесполезные вещи

]

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

]

по сравнению, комментирует ли неиспользованная переменная хорошей стратегией? Не всегда! Есть причины, по которым вы будете сохранять неиспользованную переменную на протяжении всего кода разработки и этап отладки. Предположим, что переменная использовалась в прошлой версии кода, возможно, вы еще даже не решили, должен ли старый код быть отложенным или повторным интеграцией; Значение: вы не знаете, может ли вам снова понадобиться неиспользованная переменная.

]

может полезно для отладки, чтобы сохранить код, как:
]

]
auto unused_variable __attribute__((unused)) = complicated_calculation( arg1, arg2, arg3 );
]

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

]

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

] ] ]
Заявление о выпуске Эта статья воспроизводится по адресу: https://dev.to/martinlicht/unused-variables-in-cc-why-and-how-4cm4. Если есть какие-либо нарушения, пожалуйста, свяжитесь с исследованием[email protected], чтобы удалить его.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3