voidでの&&の意味* p = && abc;


102

コードに出くわしましたvoid *p = &&abc;&&ここの意味は何ですか?右辺値参照については知っていますが&&、このコンテキストでの使用は異なります。は何を&&示していvoid *p = &&abc;ますか?


14
どこで見ましたか?
user541686

3
また、これをどこで見たかも知りたいです。
Flavius、

回答:


154

&&現在の関数で定義されているラベルのアドレスを取得するためのgccの拡張です。

void *p = &&abc 標準のC99およびC ++では不正です。

これはg ++でコンパイルされます。


42
ここで、gccのデフォルトが-pedanticだったとしたら、プログラマー全員がどれほど優れているかを想像してみてください。それから人々はgnusに関する無関係な情報の代わりにCを学びます。
ランディン、

4
なんとハック。ラベルポインターの新しい構文を考案した場合は、を使用する代わりに、新しいタイプも考案する必要がありvoid*ます。
Mark Ransom、

1
@Prasoon Saurav:反対票を投じた人はおそらくこの機能を承認せず、あなたにそれを提供します。
チャック

@Lundin:ほとんどのコンパイラでも同じことが言えます。__forceinline__declspec(naked)?私のお気に入りのMSVCismsの1つは、template<typename T> class X { friend T; }無効なC ++ 03です。
セバスチャンマッハ

2番目のリンクが停止しています。
2018年

96

それを見つける方法

これがラベルのアドレスであり、GCCに固有の機能です。

int main(void) {
    void* startp;
s:
    startp = &&s;
    printf("the assignment above starts at address %p\n", startp);
    return 0;
}

あなたはテストすることでそれを自分で理解できたでしょう:

int main(void) {
    void* startp;
    int a;
    startp = &&a;
    printf("startp=%p\n", startp);
    return 0;
}

その場合、GCCは言う:

エラー:ラベル 'a'が使用されていますが、定義されていません

ボンネットの下-アセンブリ

これを本当に理解するにはアセンブラを知る必要がありますが、ラベルのアドレスが何を意味するかを説明しようと思います。

OSがディスクから.exeファイルをロードした後、オペレーティングシステムのコンポーネントは「ローダー」と呼ばれます(Windowsには「PEローダー」があり、Linuxには「ELFローダー」またはその他のコンポーネントがあります。カーネル)、それはそのプログラムの「仮想化」を行い、それをプロセスに変えます。

このプロセスは、RAM内の唯一のプロセスであり、RAM全体(32ビットマシンでは0x00000000-0xFFFFFFFF)にアクセスできると考えています。

(上記は起こっていることのほんの少しの要約です、あなたは本当にそれを完全に理解するために組み立てを学ぶ必要があるので、我慢してください)

現在、ソースコードのラベルは基本的にアドレスです。「goto label;」そのアドレスへのジャンプ以外に何もしません(アセンブリの命令ポインターについて考えてください)。このラベルはこのRAMアドレスを格納し、それがそのアドレスを見つける方法です。

ASMについて学ぶと、そのアドレス.textが実行可能ファイルのセクション内の命令を指していることがわかります。.textセクションでは、実行するプログラムの(バイナリ)コードを保持しているものです。

あなたはこれを検査することができます:

objdump -x a.out

実用的な例

GCCで説明されているように、これを使用してジャンプテーブルを初期化できます。re2c(パラメーターを参照)などの一部のスキャナージェネレーターは、それを使用してよりコンパクトなスキャナーを生成します。たぶん、同じテクニックを採用しているパーサージェネレータさえあるでしょう。-g


4
-std = c99 -pedanticでコンパイルします。
ランディン、

2
これはGCCの拡張機能であり、言語のコア部分ではないことを言及することは非常に重要です
2010年

1
それはかなり印象的なフラビウスです。
Octavian A. Damiean、

1
私はこの種の答えが好きです。より多くの人々は、単に言われるよりも答えを見つける方法を教えられる必要があります。
Letseatlunch

1
詳細な説明をありがとう。アセンブリ関連の分析を高く評価しました。
CᴴᴀZ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.