如何处理OS X Yosemite Core标头中的非gcc兼容代码

时间:2015-01-16 02:15:33

标签: gcc clang osx-yosemite

我维护一个混合的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标准标头开始要求Clang特定扩展。不幸的是,我们的程序有很深的依赖关系,其中一些不会在Clang下编译。我们一直在使用通过MacPorts安装的GCC编译器。我现在有一个解决方法:将object.h标题中的行更改为GCC兼容。但是,在/usr/include下篡改包含文件听起来像是在惹麻烦。

任何OS X / Clang专家都能提出更可持续的方法来应对这个问题吗?这是否限制了GCC在OS X上的未来实用性?

1 个答案:

答案 0 :(得分:13)

仅供将来访问者使用,以下内容应使大多数标题符合最近的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__)