Зачем приводить неиспользуемые возвращаемые значения в void?


int fn();

void whatever()
{
    (void) fn();
}

есть ли причина для приведения неиспользуемого возвращаемого значения в void, или я прав, думая, что это полная трата времени?

дальнейшие действия:

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

Я съем свои слова, если из-за этого исчезнет ошибка...

8 99

8 ответов:

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

Это способ гарантировать, что при необходимости коды ошибок всегда обрабатываются.

Я думаю, что для C++ это, вероятно, единственное место, где я предпочитаю использовать приведения в стиле C, так как использование полной статической нотации приведения просто кажется излишним здесь. Наконец, если вы просматриваете кодирование стандартное или написание одного, то это также хорошая идея, чтобы явно заявить, что вызовы перегруженных операторов (не используя нотацию вызова функции) должны быть освобождены от этого тоже:

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.

на работе мы используем это, чтобы признать, что функция имеет возвращаемое значение, но разработчик утверждал, что это безопасно игнорировать его. Поскольку вы пометили вопрос как C++, вы должны использовать метод static_cast:

static_cast<void>(fn());

насколько компилятор идет приведение возвращаемого значения к void имеет мало смысла.

истинная причина этого восходит к инструменту, используемому в коде C, называемому Линта.

он анализирует код ищет возможные проблемы и выдает предупреждения и предложения. Если функция возвращает значение, которое затем не было проверено,lint предупредил бы в случае, если это было случайно. К тишине lint в этом предупреждении вы вызываете(void).

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

стандарт (2003) говорит в §5.2.9/4 говорит,

любое выражение может быть явно преобразовано в тип " cv void."Значение выражения отбрасываются.

вы можете написать так :

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

все формы действительны. Я обычно делаю его короче так:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

Это тоже хорошо.

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

приведение к пустоте не стоит. Это только информация для компилятора, как его лечить.

В C, это совершенно нормально, чтобы бросить в пустоту. Практически любой поймет смысл этого заявления.

В C++, у вас есть другие инструменты в вашем распоряжении. Поскольку приведения C обычно хмурятся, и поскольку явное приведение к void, скорее всего, удивит ваших коллег (это удивляет моих), у меня есть этот шаблон функции где-то

template <typename T>
void use_expression(const T&) {}

и я использую

...
use_expression(foo());

где бы я написал (void)foo() В С.

кроме того, при проверке вашего кода на соответствие стандартам MISTA (или другим) автоматические инструменты, такие как LDRA, не позволят вам вызывать функцию с возвращаемым типом без возврата значения, если вы явно не приведете возвращаемое значение к (void)