什么是WINAPI_FAMILY_PARTITION?

8

我正在阅读头文件winapifamily.h的定义,注意到WINAPI_FAMILY_PARTITION的以下定义:

#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)

宏的一般用法(以示例为例)如下:

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)

现在我很困惑,似乎它相当于
#if WINAPI_PARTITION_APP

为什么要使用#if WINAPI_FAMILY_PARTITION(...)呢?

这是winapifamily.h头文件的相关部分:

/*
 * Header files use the WINAPI_FAMILY_PARTITION macro to assign one or
 * more declarations to some group of partitions.  The macro chooses
 * whether the preprocessor will emit or omit a sequence of declarations
 * bracketed by an #if/#endif pair.  All header file references to the
 * WINAPI_PARTITION_* values should be in the form of occurrences of
 * WINAPI_FAMILY_PARTITION(...).
 *
 * For example, the following usage of WINAPI_FAMILY_PARTITION identifies
 * a sequence of declarations that are part of both the Windows Desktop
 * Partition and the Windows-Phone-Specific Store Partition:
 *
 *     #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PHONE_APP)
 *     ...
 *     #endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_PHONE_APP)
 *
 * The comment on the closing #endif allow tools as well as people to find the
 * matching #ifdef properly.
 *
 * Usages of WINAPI_FAMILY_PARTITION may be combined, when the partitition definitions are
 * related.  In particular one might use declarations like
 * 
 *     #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
 *
 * or
 *
 *     #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
 *
 * Direct references to WINAPI_PARTITION_ values (eg #if !WINAPI_FAMILY_PARTITION_...)
 * should not be used.
 */ 
#define WINAPI_FAMILY_PARTITION(Partitions)     (Partitions)

我猜是抽象化。就像有一个 const int MAX_WIDTH = 1024;。当然,宏实现的操作现在可能是无操作。但它一直都是无操作吗?将来也会是吗? - Angew is no longer proud of SO
2个回答

1
他们现在正在定义一个 API,这个 API 未来可能会支持更多的智能功能。例如,他们可能会在未来将 WINAPI_PARTITION_DESKTOP 定义为 (2 | WINAPI_PARTITION_DEPRECATED),并让 WINAPI_FAMILY_PARTITION(x) 检查 x 中的 WINAPI_PARTITION_DEPRECATED 位。如果开发者假设 WINAPI_PARTITION_DESKTOP 将扩展为单个整数常量表达式,则 Microsoft 将无法实现这种未来的灵活性。

1

假设一个文件包含可以在Metro应用程序中使用的代码
因此,头文件将定义

WINAPI_FAMILY = WINAPI_PARTITION_APP

=>WINAPI_FAMILY_DEKSTOP_APP has value of 2

#define WINAPI_FAMILY_PARTITION(Partition)  ((WINAPI_FAMILY & Partition) == Partition)

宏将检查API族的类型。
现在假设您想编写仅在Metro环境下运行的代码,因此。
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
    your code for metro application
#endif

替换值

WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) => ((2 & 2) == 2

现在,如果用户想要使用地铁代码,他们必须定义为 WINAPI_FAMILY = WINAPI_PARTITION_APP
为什么需要间接性?
3 = >  00 11     (both desktop & metro)
2 =>   00 10     (metro apis)
1  =>  00 01     (desktop)

这个函数宏被用来判断是否可以使用两种API,因为如果WINAPI_FAMILY为3,意味着两种API都可以使用。 #define WINAPI_FAMILY_PARTITION(Partition),然后你可以指定Partition = 2, 3, 并执行(3 & 1)或(3& 2) == 1, 这意味着如果WINAPI_FAMILY = 3,你可以使用桌面或Metro API, 这就是为什么需要使用与运算的原因。


这并没有回答问题,为什么我们必须使用间接寻址 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) 而不是 #if WINAPI_PARTITION_APP - IInspectable
1
很有趣的是,您的定义与我机器上的不同。您能否提供更多信息,比如您正在运行哪个Windows操作系统版本?也许您正在创建什么项目? - Yuchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接