4

次のマクロは、include/linux/kernel.h にあります。

#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })

__here に適用された 2 番目の & が何をするのかわかりません。1 つ目はローカル レーベルの住所ですが、2 つ目はどうでしょうか。

4

2 に答える 2

5

2 番目&&&、GCC が名前を変数としてではなくラベルとして検索するようにするために必要です。例えば

foo: ;
int foo;

void *p1 = &&foo;
void *p2 = &foo;

2 番目の初期化子は int 変数を参照します。

于 2012-12-16T14:54:28.777 に答える
4

&&ラベルのアドレスを取得することだと思います。

これは gcc の拡張であり、C99 標準ではこの動作がサポートされていないと思います。

詳細については、これを参照してください.. gcc ラベルと値

そしてローカルラベル宣言

あなたの場合、

#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })

実際のコード_THIS_IP_では、ブロックスコープの下のコードに置き換えられます

{ __label__ __here;
 __here: 
(unsigned long) &&__here; 
}

ローカル ラベル を宣言してい__hereます。したがって&&、single で変数のアドレスを取得するときに使用するラベルのアドレスを取得します&

于 2012-12-16T14:56:18.370 に答える