在不同版本的 Mac OS X 之间分隔代码



我希望在 10.6 及以下编译一些代码,而不是 10.7 及以上版本。

例如:

#ifdef current version is MAC_OS_X_VERSION_10_6 or below
// do this
elif current version is MAC_OS_X_VERSION_10_7 or above 
//do that
#endif

有人可以帮我为它设置适当的宏吗?我查看了AvailabilityMacros.h,但无法弄清楚正确的ifdef。

我有一个动态库,它不能在 10.7 及更高版本下加载,但在 10.6 下可以正确加载。这是由于私有符号_CGContextAppendPath。我想让它在 10.6 及以下版本下使用,但避免在 10.7 及更低版本中使用它。这是因为 10.7 及更高版本上不存在_CGContextAppendPath符号。

我用过,

SInt32 version = 0;
Gestalt( gestaltSystemVersion, &version );
bool lionabove = ( version >= 0x1070 );

没有用。

对于目标 C,首选途径是通过以下方式检查特定 API 的可用性,例如 [object respondsToSelector:] .

对于您正在使用的 C 库,弱链接到CoreGraphics.framework(因此当某些函数不存在时加载不会失败)并通过 &_CGContextAppendPath != NULL 检查相关函数的可用性。

http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Configuring/configuring.html#//apple_ref/doc/uid/10000163i-CH1-107837 和 http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html#//apple_ref/doc/uid/20002000-1114537-BABHHJBC 中的详细信息。

苹果为iOS和Mac OS 10.6及更高版本(位于<SDK>/usr/include/Availability.h)推出了一个新的Availability.h宏文件。你可以像这样做你所要求的:

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 1070
    // code to run up through 10.6
#else
    // code to run on 10.7 or higher
#endif

请注意,此宏也可用(根据您的逻辑,这可能更可取):

#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
    // code to run on 10.7 or above
#else
    // code to run below 10.7
#endif    

这方面的文档在这里:有条件地编译不同的SDK,如果你混合使用iOS和Mac OS X代码,特别值得一看。我也强烈建议阅读上面提到的头文件。

最新更新