如何定义CFIndex的最大值和最小值?

时间:2016-09-06 07:56:53

标签: ios macros core-foundation

我尝试定义这样的宏:

#import <CoreFoundation/CFBase.h>

#if __LLP64__
#define CFIndexMax LONG_LONG_MAX;
#define CFIndexMin LONG_LONG_MIN;
#else
#define CFIndexMax LONG_MAX;
#define CFIndexMin LONG_MIN;
#endif

但是Xcode始终警告我没有__LLP64_的定义CFBase.handroid:configChanges="orientation|keyboardHidden|screenSize" 中的条件定义。

2 个答案:

答案 0 :(得分:0)

实际上,编译器定义__LLP64__(或更可能是__LP64__)。 如果再次查看CFBase.h预处理器逻辑,则会在编译64位Windows目标时看到它强制定义__LLP64__

#if defined(__WIN64__) && !defined(__LLP64__)
#define __LLP64__ 1
#endif

版权所有(c)1998-20016 Apple Inc.

如果您担心macOS上CGFloat(甚至CFIndex类型的大小,请查看CGBase.h以了解内容的定义:

#if defined(__LP64__) && __LP64__
#define CGFLOAT_TYPE double
#define CGFLOAT_IS_DOUBLE 1
#define CGFLOAT_MIN DBL_MIN
#define CGFLOAT_MAX DBL_MAX
#else
#define CGFLOAT_TYPE float
#define CGFLOAT_IS_DOUBLE 0
#define CGFLOAT_MIN FLT_MIN
#define CGFLOAT_MAX FLT_MAX
#endif

版权所有(c)2000-2011 Apple Inc.

您可以根据CFIndex的布尔值有条件地定义最大值和最小值CGFLOAT_IS_DOUBLE,这不会很快改变。

最后,我相信Windows是64位运行时中唯一大小为long类型为32位的操作系统(也就是说,与在64位运行时中为64位的linux和macOS相比)

如果您确定您正在启用正确的定义,请始终检查变量是否先在预编译器中定义:

#if defined(__LLP64__) & __LLP64__
// conditionally define more stuff
#endif

答案 1 :(得分:0)

您的问题是,您正在检查__LLP64__,但是您要检查__LLP64__存在

#ifdef __LLP64__
#define CFIndexMax LONG_LONG_MAX;
#define CFIndexMin LONG_LONG_MIN;
#else
#define CFIndexMax LONG_MAX;
#define CFIndexMin LONG_MIN;
#endif

但是,只有Windows使用LLP64模型。您是否计划在Windows上构建此代码?如果没有,您应该通过消除条件来简化您的代码。