如何定义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
的布尔值有条件地定义最大值和最小值 CFIndex
es,该值不会很快改变。
最后,我相信 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 上构建此代码吗?如果不是,您应该通过消除条件来简化代码。
我试着定义这样一个宏:
#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
的布尔值有条件地定义最大值和最小值 CFIndex
es,该值不会很快改变。
最后,我相信 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 上构建此代码吗?如果不是,您应该通过消除条件来简化代码。