С++: характеристики типа Boost 1.48 и Cocoa странность включения
Я только что обновил boost до версии 1.48.0 в проекте, который я разрабатываю на OSX Lion, который также включает заголовки Cocoa. После этого я получил массу ошибок, указывающих на has_prefix_operator.hpp и has_binary_operator.hpp, которые все указывают на строки типа i.e.:
BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((make<Lhs>() BOOST_TT_TRAIT_OP make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));
../../boost_1_48_0/импульс/type_traits/детали/has_binary_operator.hpp: 157: 4: ошибка: ожидаемое выражение [1]
Попытавшись, так как я не мог прочитать никакого смысла в этих ошибках, я заметил, что если я включу порядок включения из:
#import <Cocoa/Cocoa.h>
#include <boost/type_traits.hpp>
к
#include <boost/type_traits.hpp>
#import <Cocoa/Cocoa.h>
вещи волшебным образом работают. Я очень смущен этим, так как он отлично справился с предыдущим выпуском ускорения, и я не знаю, почему это происходит. Любые идеи о том, что может происходить?
Спасибо!
Ответы
Ответ 1
У меня была, по сути, одна и та же проблема, и с ключом из ildjam я нашел причину и обход.
Имя (ужасное) макроса - это проверка, определенная в AssertMacros.h. Согласно комментариям в этом файле, в будущем Apple удалит старые имена. На данный момент Apple добавила обход для подавления старых имен, которые должны определять __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES до 0 до обработки AssertMacros.h. например.
#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
#import <Cocoa/Cocoa.h>
Если вы используете префиксный файл, вы можете поместить там определение. В качестве альтернативы, непосредственный обход - это проверка undef перед включением type_traits.hpp.
#ifdef check
#undef check
#endif
#include "boost/type_traits.hpp"
(Детали также представлены в Boost Trac: https://svn.boost.org/trac/boost/ticket/6219)
Ответ 2
Отклонение от комментариев, поскольку это, по-видимому, является ответом...
Кажется, что Cocoa.h
прямо или косвенно определяет макрос с тем же именем, что и один из идентификаторов, используемых в коде Boost. I.e., Cocoa.h
определяет макрос с именем Lhs
или Rhs
или has_operator
или другое другое ужасное имя макроса и противоречит соответствующим идентификаторам, используемым в коде Boost.
Если вы хотите внести свой вклад в получение этого исправления в будущей версии Boost, пожалуйста, сузите оскорбительные имена макросов и отправьте отчет об ошибке Boost Trac.