【问题标题】:c++: Boost 1.48 type traits and Cocoa inclusion weirdnessc++: Boost 1.48 类型特征和 Cocoa 包含怪异
【发布时间】:2011-12-06 06:37:35
【问题描述】:

我刚刚在我正在 OSX Lion 上开发的项目中将 boost 更新到 1.48.0 版本,该项目还包括 Cocoa 标头。这样做之后,我得到了一大堆错误,它们都指向 has_prefix_operator.hpp 和 has_binary_operator.hpp,它们都指向如下行:

   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/boost/type_traits/detail/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>

事情神奇地起作用。我对此感到非常困惑,因为它与之前的 boost 版本配合得很好,我不知道为什么会这样。对可能发生的事情有任何想法吗?

谢谢!

【问题讨论】:

  • 看来Cocoa.h 直接或间接定义了一个与Boost 代码中使用的标识符之一同名的宏。
  • 嗯,是的,很可能是这样。- 看起来很奇怪,因为所有的 boost 宏都以 BOOST_ 开头,因此相当独特。太棒了!
  • 我不是说Cocoa.h是定义一个以BOOST_开头的宏;我的意思是说Cocoa.h 正在定义一个名为LhsRhshas_operator 或其他一些可怕的宏名称的宏,并且它与Boost 代码中使用的正确标识符冲突。
  • 感谢您的澄清。-希望在下一个版本中修复,因为这有点令人烦恼。
  • 标头与 Qt 结合会导致类似的错误。因此,您可能想在错误跟踪器中查找相关内容。

标签: c++ cocoa boost


【解决方案1】:

我基本上遇到了同样的问题,根据 ildjam 的线索,我找到了原因并找到了解决方法。

(可怕的)宏名称是 check,在 AssertMacros.h 中定义。根据该文件中的 cmets,未来 Apple 将删除旧名称。目前,Apple 添加了一种解决方法来抑制旧名称,即在处理 AssertMacros.h 之前将 __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 定义为 0。例如

#define __ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES 0
#import <Cocoa/Cocoa.h>

如果您使用前缀文件,那么您可以将定义放在那里。或者,直接的解决方法是在包含 type_traits.hpp 之前进行 undef 检查。

#ifdef check
#undef check
#endif
#include "boost/type_traits.hpp"

(也提交给 Boost Trac 的详细信息:https://svn.boost.org/trac/boost/ticket/6219

【讨论】:

  • 在 OS X 10.9.2 上使用 boost 1.55,这个答案仍然是相关且正确的。截至 3 周前,这似乎已在 type_traits 中修复。有关详细信息,请参阅上面列出的错误报告。
【解决方案2】:

从 cmets 转发,因为这显然是答案...

似乎Cocoa.h 直接或间接定义了一个与Boost 代码中使用的标识符之一同名的宏。即,Cocoa.h 正在定义一个名为 LhsRhshas_operator 或其他同样糟糕的宏名称的宏,它与 Boost 代码中使用的正确标识符冲突。

如果您想为在未来版本的 Boost 中修复此问题做出贡献,请缩小有问题的宏名称并在 Boost Trac 上提交错误报告。

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多