如何在 OS X Yosemite Core headers 中处理 non-gcc 兼容代码

How to cope with non-gcc compatible code in OS X Yosemite Core headers

我维护一个混合的 C 和 C++ 命令行程序,需要在 Linux、Windows 和 OS X 上 运行。我最近升级到 Yosemite 和我的 OS X 构建现在失败了。错误是:

/usr/include/dispatch/object.h:143:15: error: expected identifier or '(' before '^' token

Other folks have run into this bug

失败的代码行是使用'^'的typedef,它是non-standard extension providing support for closures

潜在的问题似乎是某些 Apple 标准 header 开始需要特定于 Clang 的扩展。不幸的是,我们的程序有一组非常深的依赖关系,其中一些不能在 Clang 下编译。我们一直在使用通过 MacPorts 安装的 GCC 编译器。我现在有一个解决方法:将 object.h header 中的行更改为与 GCC 兼容。但是,破解 /usr/include 下的包含文件对我来说听起来像是在自找麻烦。

任何 OS X/Clang 大师都可以提出更可持续的方法来解决这个问题吗?这会限制 GCC 在 OS X 上的未来用途吗?

仅供将来的访问者使用,以下内容应该最能 headers 使用最新的 GCC 版本:

dispatch/object.h变化

typedef void (^dispatch_block_t)(void);

#ifdef __clang__
typedef void (^dispatch_block_t)(void);
#else
typedef void* dispatch_block_t;
#endif

并在 Availability.h 中更改

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED)

#elif defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && defined(__clang__)