次のマクロは、include/linux/kernel.h にあります。
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
__here に適用された 2 番目の & が何をするのかわかりません。1 つ目はローカル レーベルの住所ですが、2 つ目はどうでしょうか。
次のマクロは、include/linux/kernel.h にあります。
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
__here に適用された 2 番目の & が何をするのかわかりません。1 つ目はローカル レーベルの住所ですが、2 つ目はどうでしょうか。
2 番目&
は&&
、GCC が名前を変数としてではなくラベルとして検索するようにするために必要です。例えば
foo: ;
int foo;
void *p1 = &&foo;
void *p2 = &foo;
2 番目の初期化子は int 変数を参照します。
&&
ラベルのアドレスを取得することだと思います。
これは gcc の拡張であり、C99 標準ではこの動作がサポートされていないと思います。
詳細については、これを参照してください.. gcc ラベルと値
そしてローカルラベル宣言
あなたの場合、
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
実際のコード_THIS_IP_
では、ブロックスコープの下のコードに置き換えられます
{ __label__ __here;
__here:
(unsigned long) &&__here;
}
ローカル ラベル を宣言してい__here
ます。したがって&&
、single で変数のアドレスを取得するときに使用するラベルのアドレスを取得します&
。