我维护一个混合的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上的未来实用性?
答案 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__)