Что это значит: «предупреждение: сравнение между« enum A <B>»и« enum A <B>»»? - PullRequest
2 голосов
/ 24 октября 2010

Я добавил следующее в строке 42 proto.h:

typedef boost::make_unsigned<off_t>::type uoff_t;

И теперь я получаю это многословное и запутанное предупреждение от gcc, жалующегося на сравнение перечисления с тем же типом перечисления:

In file included from proto.cpp:12:
/usr/local/include/boost/type_traits/is_unsigned.hpp: In instantiation of 'boost::detail::is_ununsigned_helper<long int>':
/usr/local/include/boost/type_traits/is_unsigned.hpp:73:   instantiated from 'boost::detail::is_unsigned_imp<long int>'
/usr/local/include/boost/type_traits/is_unsigned.hpp:123:   instantiated from 'boost::is_unsigned<long int>'
/usr/local/include/boost/type_traits/make_unsigned.hpp:110:   instantiated from 'boost::detail::make_unsigned_imp<long int>'
/usr/local/include/boost/type_traits/make_unsigned.hpp:130:   instantiated from 'boost::make_unsigned<long int>'
proto.h:42:   instantiated from here
/usr/local/include/boost/type_traits/is_unsigned.hpp:40: warning: comparison between 'enum boost::detail::is_unsigned_values<long int>::<anonymous>' and 'enum boost::detail::is_unsigned_values<long int>::<anonymous>'

Может кто-нибудь расшифровать это?

1 Ответ

3 голосов
/ 24 октября 2010

Вот что происходит

BOOST_NO_INCLASS_MEMBER_INITIALIZATION определяется в Boost.Config (не уверен, почему это так для gcc, но я пока оставлю это в покое).Таким образом,

BOOST_STATIC_CONSTANT(no_cv_t, minus_one = (static_cast<no_cv_t>(-1)));
BOOST_STATIC_CONSTANT(no_cv_t, zero = (static_cast<no_cv_t>(0)));

объявлений в boost::detail::is_unsigned_values расширяются до

enum { minus_one = (static_cast<no_cv_t>(-1)) };
enum { zero = (static_cast<no_cv_t>(0)) };

, после чего эти два перечислителя неназванных, но различных перечислений сравниваются в boost::detail::is_ununsigned_helper.Следовательно, предупреждение, которое не произошло бы, если бы BOOST_STATIC_CONSTANT() было расширено до static const no_cv_t blah blah....

Осталось ответить на два вопроса:

-> Почему BOOST_NO_INCLASS_MEMBER_INITIALIZATION получаетопределен в вашем случае?

-> Если этот макрос определен, может быть выдано такое предупреждение (сравнение перечислителей с различными перечислениями).Здесь безвредно, но было бы неплохо предотвратить это в Boost.Стоит ли это того?

Примечание. Я использовал код Boost 1.43 для справки.

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