如何在 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__)
我维护一个混合的 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__)