回答:
void*
ます。
__forceinline
?__declspec(naked)
?私のお気に入りのMSVCismsの1つは、template<typename T> class X { friend T; }
無効なC ++ 03です。
これがラベルのアドレスであり、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