我正在查看一些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)的作用是什么?
答案 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));
}