int fn();
void whatever()
{
(void) fn();
}
Есть ли причина приводить неиспользованное возвращаемое значение к void, или я прав, думая, что это пустая трата времени?
Следовать за:
Что ж, это кажется довольно всеобъемлющим. Я полагаю, это лучше, чем комментировать неиспользованное возвращаемое значение, поскольку самодокументирующий код лучше, чем комментарии. Лично я отключу эти предупреждения, так как это ненужный шум.
Я съем свои слова, если из-за него сбежит жук ...
На работе мы используем это, чтобы подтвердить, что функция имеет возвращаемое значение, но разработчик утверждает, что его можно безопасно игнорировать. Поскольку вы пометили вопрос как C ++, вы должны использовать static_cast :
Что касается компилятора, приведение возвращаемого значения к void не имеет большого значения.
источник
Истинная причина этого восходит к инструменту, используемому в коде C, который называется lint .
Он анализирует код, ищет возможные проблемы и выдает предупреждения и предложения. Если функция вернула значение, которое затем не проверялось,
lint
выдаст предупреждение в случае, если это было случайно. Чтобы отключитьlint
это предупреждение, вы отправляете вызов(void)
.источник
Приведение в
void
используется для подавления предупреждений компилятора о неиспользуемых переменных и несохраненных возвращаемых значениях или выражениях.Стандарт (2003) говорит в §5.2.9 / 4:
Итак, вы можете написать:
Все формы действительны. Обычно я делаю его короче:
Это тоже нормально.
источник
Начиная с C ++ 17 у нас есть
[[maybe_unused]]
атрибут, который можно использовать вместоvoid
приведения.источник
nodiscard
который может представлять интерес: stackoverflow.com/a/61675726/895245 Также я думаю, что вы не можете[[maybe_unused]]
напрямую обращаться к вызову, который кажется, только к фиктивной переменной, которая принимает возврат вызова? Если это правильно, это немного шатко.Превращение в пустоту не требует затрат. Это только информация для компилятора, как с этим обращаться.
источник
(void)
требует времени и сил и заставляет задуматься, знал ли автор, как работают выражения.Для функциональности вашей программы приведение к void бессмысленно. Я бы также сказал, что вы не должны использовать его, чтобы сигнализировать о чем-то человеку, читающему код, как предлагает ответ Дэвида. Если вы хотите что-то сообщить о своих намерениях, лучше использовать комментарий. Добавление такого приведения будет только выглядеть странно и вызовет вопросы о возможной причине. Просто мое мнение ...
источник
For the functionality of you program casting to void is meaningless
Для самодокументирования и количества предупреждений при компиляции на самом деле нет.you should not use it to signal something to the person that is reading the code [...] it is better to use a comment.
Лучший комментарий - это отсутствие комментария , когда код объясняет сам себя. И, опять же, позволяет компилятору корректных предупреждений оставаться в процессе.Кроме того, при проверке соответствия вашего кода стандартам MISTA (или другим) автоматические инструменты, такие как LDRA, не позволят вам вызывать функцию с возвращаемым типом без возврата значения, если вы явно не приведете возвращаемое значение к (void)
источник
C ++ 17
[[nodiscard]]
C ++ 17 стандартизировал «бизнес без учета возвращаемого значения» с помощью атрибута.
Поэтому я надеюсь, что совместимые реализации всегда будут предупреждать, только когда
nodiscard
заданы, и никогда не предупреждать иначе.Пример:
main.cpp
компиляции:
результат:
Следующее все избегает предупреждения:
Мне не удалось использовать
maybe_unused
прямо во времяf()
звонка:дает:
Работа с
(void)
приведением типов не является обязательной, но "поощряется" в стандарте: Как я могу намеренно отказаться от возвращаемого значения [[nodiscard]]?Также, как видно из предупреждающего сообщения, одним из «решений» предупреждения является добавление
-Wno-unused-result
:хотя я бы, конечно, не рекомендовал игнорировать подобные предупреждения во всем мире.
C ++ 20 также позволяет добавлять причину в
nodiscard
as,[[nodiscard("reason")]]
как указано по адресу: https://en.cppreference.com/w/cpp/language/attributes/nodiscardНКУ
warn_unused_result
АтрибутПеред стандартизацией
[[nodiscard]]
и для C, прежде чем они окончательно решат стандартизировать атрибуты, GCC реализовал точно такую же функциональность сwarn_unused_result
:который дает:
Следует отметить, что, поскольку ANSI C не имеет стандарта для этого, ANSI C не указывает, какие функции стандартной библиотеки C имеют атрибут или нет, и поэтому реализации сами приняли решение о том, что следует или не отмечать
warn_unuesd_result
, что Вот почему в общем случае вам придется использовать(void)
приведение, чтобы игнорировать возврат любых вызовов стандартных библиотечных функций, чтобы полностью избежать предупреждений в любой реализации.Протестировано в GCC 9.2.1, Ubuntu 19.10.
источник