这个DEFINEd常数的值是多少?

时间:2016-06-16 19:16:48

标签: android c

我正在查看一些Android蓝牙源代码,我注意到这些定义:

/* Non Connectable Adv state is supported. 0x0000000000000001 */
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK          0x01
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF           0
#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x)      ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)

前两个是非常明显的,但第三个的价值是什么,那个(x)的作用是什么?

2 个答案:

答案 0 :(得分:1)

大多数宏都是简单的文本替换,在代码中出现的位置进行了扩展。所以第三个

#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x) ((x)[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF] & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)

替换它包含的两个宏,扩展到:

((x)[0] & 0x01)

(x)在括号中,以确保传递给宏的任何参数优先于索引。例如,如果代码是

char str[] = "123";
int i = HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(str + 1);

没有括号x周围的括号,宏将扩展为

(str + 1[0] & 0x01)

会导致错误。括号使它

((str + 1)[0] & 0x01)

这将有效。

答案 1 :(得分:0)

我相信这段代码的意思就是这个。

如果支持Non Connectable Adv状态   比它在数组的偏移HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF那个   结构由用户给出   使用参数x(HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x))   就位HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK的值为1 否则该位将为0

在DSP和其他具有相似(但不完全相同)处理器版本的处理器中。硬件的差异通常由宏表示,如下例所示。我们故意为不同的处理器设置不同的偏移量和不同的掩码。

更罕见的用法可能是使用不同类型的数组“调用”宏。 在下面的示例中,如果定义了TYPE1,则我们将长整数的宏数组“调用”为参数。如果定义了TYPE2,那么我们用一个短整数数组作为参数“调用”宏。

这两种方法都将宏实现为一种原始但快速的虚函数。

//#define PROCESSOR1 or PROCESSOR2 
//#define TYPE1 or TYPE2

#ifdef PROCESSOR1
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK          0x04
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF           2
#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x)      ((x)\
[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF]\
& HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)
#elif defined(PROCESSOR2)
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK          0x01
#define HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF           0
#define HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(x)       ((x)\
[HCI_SUPP_LE_STATES_NON_CONN_ADV_OFF]\
 & HCI_SUPP_LE_STATES_NON_CONN_ADV_MASK)
#endif



#ifdef TYPE1
long Arr[4] = {1,2,3,4};
#elif defined(TYPE2)
short Arr[4] = {1,2,3,4};
#endif


int f()
{
    return(HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(Arr));
}