boost::system::(...)_категория определена, но не используется

StackOverflow https://stackoverflow.com/questions/1814548

Вопрос

В настоящее время я получаю предупреждения компилятора, которые напоминают предупреждение, которое я дал в названии вопроса.Предупреждения, такие как....

warning: 'boost::system::generic_category' defined but not used

warning: 'boost::system::posix_category' defined but not used

warning: 'boost::system::errno_ecat' defined but not used

warning: 'boost::system::native_ecat' defined but not used

Насколько я знаю, на программу это никак не влияет.Тем не менее, мне не нравятся предупреждения, висящие повсюду, но я понятия не имею, что эти предупреждения пытаются мне сказать, кроме того, что что-то определенное и связанное с boost висит где-то и не используется.Однако все, что я определил, я использовал.Библиотеки boost, которые я использую, - это библиотека random и библиотека файловой системы.

Когда я проверяю источник предупреждения, он выводит файл Boost error_category.hpp и выделяет некоторые static consts, которые комментируются либо как "предопределенные категории ошибок", либо как "устаревшие синонимы".Может быть, проблема как-то связана с моей обработкой ошибок (или их отсутствием) при использовании библиотеки?

Кто-нибудь может дать некоторое представление о том, почему появляются эти предупреждения?Я что-то полностью упускаю из виду?

P.S.Предупреждения находятся на максимальном уровне.

Это было полезно?

Решение

Это относится к библиотеке error_code в Boost.Системная библиотека.Коды ошибок Boost содержат два атрибута:ценности и категории.Чтобы сделать error_codes расширяемым, чтобы пользователи библиотеки могли создавать свои собственные категории ошибок, разработчикам boost потребовался какой-то способ представления уникальной категории кода ошибки.Простого идентификационного номера будет недостаточно, поскольку это может привести к тому, что два проекта будут использовать конфликтующие идентификационные номера для пользовательских категорий ошибок.

Итак, по сути, то, что они сделали, это использовали адреса памяти в виде статических объектов, которые наследуются от базового класса error_category.Эти переменные на самом деле ничего не делают, кроме как служат уникальными идентификаторами определенной категории ошибок.Поскольку они, по сути, являются статическими фиктивными объектами с уникальными адресами в памяти, вы можете легко создавать свои собственные категории ошибок, которые не будут мешать "идентификаторам" других категорий ошибок. Смотрите здесь для получения дополнительной информации.

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

Другие советы

Я согласен с @Charles Salvia, но хотел бы добавить, что, по крайней мере, начиная с версии Boost 1.44.0, эти определения теперь завернуты - их следует исключить как устаревшие.Поэтому, если вы их не используете, просто включите следующие строки перед включением файла заголовка:

#ifndef BOOST_SYSTEM_NO_DEPRECATED
#define BOOST_SYSTEM_NO_DEPRECATED 1
#endif

Я попробовал BOOST_SYSTEM_NO_DEPRECATED предложено @M.Tibbits, и, похоже, это удалило некоторые экземпляры предупреждений (в большой системе, построенной под Linux), но не все.

Однако, используя -isystem вместо того , чтобы -I включение заголовков boost (и игнорирование их проблем) сработало для меня.

Предложенный https://exceptionshub.com/how-do-you-disable-the-unused-variable-warnings-coming-out-of-gcc.html

Объяснено (косвенно) GNU GCC: http://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top