С++: характеристики типа 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.