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

How to define Max and Min value of CFIndex?

我试着定义这样一个宏:

#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.h.

中有条件定义的

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

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

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

如果您担心 CGFloat 的大小(甚至 CFIndex mac 上的类型 OS,请查看 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.

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


最后,我相信 Windows 是唯一的 OS,其 long 类型的大小在 64 位运行时是 32 位(也就是说,与 linux 和 macOS 在 64 位运行时是 64 位)。

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

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

您的问题是您正在检查 __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 上构建此代码吗?如果不是,您应该通过消除条件来简化代码。