2016-06-16 4 views
0

私はいくつかのAndroidのBluetoothソースコードを探しています、と私はこれらの定義に気づい:このDEFINEd定数の値は何ですか?

/* 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) 

最初の2は非常に明白ですが、どのような三番目の値であり、そして何がその(X)行う?

+1

xは引数です。それはマクロです。本質的にコンパイル時の "関数"です。どこでもHCI_LE_STATES_NON_CONN_ADV_SUPPORTED(somevalue) 'があれば、そのマクロ/関数の戻り値はコンパイルされたバイナリに入れられます。 –

+1

*引数*として指定した配列の特定の要素のビット単位の論理積で、特定の値を持ちます。要素インデックスと 'AND'オペランドは最初の2つの' #define'で定義されています。 '(x)[0]&1)' –

+1

'(x)'は括弧で囲まれているため、式xの一部として渡された修飾子が索引付けよりも優先されます。 –

答えて

1

ほとんどのマクロは、単純なテキスト置換で、コード内で展開されます。そこで、第三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)どんな引数がマクロに渡されることを確実にするために、括弧内にあるインデックスよりも優先されます。したがって、たとえばコードは、マクロが

障害を引き起こす
(str + 1[0] & 0x01) 

に拡大する引数x周りのブラケットなし

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

ある場合。角括弧はそれになります

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

これは動作します。

0

私は、このコードの意味はこれだと信じています。場所HCI_SUPP_LE_STATES_NON_CONN_ADV_MASKで

非接続可能広告主の状態は、その 構造はパラメータxとユーザ によって与えられることアレイのオフセットHCI_SUPP_LE_STATES_NON_CONN_ADV_OFFよりも がサポートされている場合(HCI_LE_STATES_NON_CONN_ADV_SUPPORTED(X)) ビットとなり値1 それ以外の場合、このビットは値0となります。

類似した(しかし同一ではない)プロセッサーバージョンを持つDSPおよび他のプロセッサーでは、ハードウェアの違いは、一般的に以下の例のようにマクロで表現されます。意図的に異なるオフセットと異なるマスクを異なるプロセッサに設定しています。

もっと珍しいのは、異なるタイプの配列でマクロを「呼び出す」かもしれません。 以下の例では、TYPE1が定義されている場合、long整数のマクロ配列を引数として「呼び出す」よりも大きな値になります。 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)); 
} 
関連する問題