FreeBASIC マニュアルのトップに戻る

FreeBASIC PpPragmaReserve

目次→その他→プリ・プロセッサ#PRAGMA RESERVE←オリジナル・サイト

#PRAGMA RESERVE 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

プリプロセッサー指示文

構文:
#pragma reserve symbol
or
#pragma reserve (extern) symbol
or
#pragma reserve (asm) symbol
or
#pragma reserve (asm, extern) symbol) or #pragma reserve (extern, asm) symbol)

パラメタ:
symbol
予約するシンボル名。

説明:
#pragma reserved 命令文は、ユーザーが fbc コンパイラの内部シンボルテーブルにアクセスしてシンボル名を予約できるようにするプリプロセッサ指示です:
- #pragma reserve symbol
命令文は、現在のスコープ / 名前空間でシンボル名を予約し、シンボルが再定義されたり、式で使われたりするとエラーを発生します。
- #pragma reserve (extern) symbol
命令文はグローバルシンボル名を予約し、予約されたシンボルがグローバル名前空間のモジュールレベルの手続きや共有変数に使われると警告を生成します。
- #pragma reserve (asm) symbol
命令文は、すべての ASM 命令文とブロックで、ASM シンボル名を予約します。
- #pragma reserve (asm, extern) symbol) or #pragma reserve (extern, asm) symbol)
前の 2つの命令文を実行します。この組合せの命令文は、グローバル ASM シンボル名を予約し、予約されたシンボルがグローバル名前空間のモジュールレベルの手続きまたは共有変数に使われた場合に警告を発生します。

最初の 2つの構文の主な目的は、コンパイル・エラーや実行時のクラッシュを引き起こす一部のシンボルに対処するのよ役立つメカニズムを作成することです。
fbc コンパイラのシンボル名の中には、バックエンド・コンパイラ(gcc、as など)にそのまま出力されるものがあります。シンボル名は、バックエンド・コンパイラによって予約されたキーワードになります。
この場合、通常、2つの結果になります:

- バックエンドでのコンパイルエラー、
- バックエンドでの不正なコード生成(コンパイルは成功して、実行時に予期しないクラッシュ)。
#pragma reserve symbol 命令文を使うと、fbc コンパイラは、現在のスコープ / 名前空間でのこのシンボル名の不正使用専用のエラーメッセージを出力できます。
#pragma reserve (extern) symbol 命令文を使うと、fbc コンパイラは、このシンボル名が、グローバル名前空間のモジュールレベルの手続きまたは共有変数で不正使用されていることを示す専用の警告メッセージを出力できます。

3番目と 4番目の構文と密接に関連する副次的な目的は、ASM ブロックと命令文で使われる ASM ワードです。
これにより、fbc ASM キーワードリストに新しい ASM 命令名を追加できます(したがって、fbc によって暗黙で予約されていません)。
したがって、#pragma reserve (asm) symbol または #pragma reserve (asm, extern) symbol 、または任意の #pragma reserve (extern, asm) symbol 命令文を使うと、fbc コンパイラは常に装飾されていない ASM 命令シンボル名をバックエンドコンパイラに送信できます。

注意: #pragma reserve (extern) and #pragma reserve (asm) (およびこれらを組み合わせた構文) は、スコープ・ブロックまたは手続きで使われるとエラーになります。

例:
シンボル名の、禁止/定義の警告/使用の例(メカニズムのみ):
#pragma reserve myName1
#pragma reserve myName2
#pragma reserve myName3
#pragma reserve myName4
#pragma reserve myName5
#pragma reserve (Extern) myName11
#pragma reserve (Extern) myName12
#pragma reserve (Extern) myName13
#pragma reserve (Extern) myName14
#pragma reserve (Extern) myName15

Dim As Integer myName1             '' error: Duplicated definition, myName1 in 'Dim As Integer myName1 ...
Print myName1                      '' error: Illegal use of reserved symbol, found 'myName1' in 'Print myName1 ...

Scope
    Dim As Integer myName2         '' OK
    Print myName2                  '' OK
End Scope

Dim As Integer myName11            '' OK
Print myName11                     '' OK
Dim Shared As Integer myName12     '' warning: Use of reserved global or backend symbol, myName12
Print myName12                     '' OK

Namespace N
    Dim As Integer myName3         '' OK
    Dim As Integer myName13        '' OK
    Sub myName4()                  '' OK
    End Sub
    Sub myName14()                 '' OK
    End Sub
End Namespace
Print N.myName3                    '' OK
Print N.myName13                   '' OK
N.myName4()                        '' OK
N.myName14()                       '' OK

Sub myName5()                      '' error: Duplicated definition, before ''' in 'Sub myName4() ...
End Sub
myName5()                          '' error: Illegal use of reserved symbol, found 'myName4' in 'myName4() ...

Sub myName15()                     '' warning: Use of reserved global or backend symbol, myName14
End Sub
myName15()                         '' OK

'xyz' はまだ fbc ASM キーワードリストに入っていない(つまり、fbc によって暗黙で予約されていない)新しい ASM 命令であり、この 'xyz' シンボルはグローバル変数名の定義にも使われると仮定します:
- したがって、fbc は、挿入された ASM ブロックに装飾された「xyz」シンボル (XYZ$) をバックエンド・コンパイラに出力します:
'' for x86_64

#cmdline "-gen gas64 -r"

Dim Shared xyz As Integer

Sub proc Naked()
    Asm
        xyz
        ret
    End Asm
End Sub

/'
Output in the .Asm file:

   .intel_syntax noprefix
   .section .text
   .text
   .globl PROC
PROC:
   .L_0004:
   XYZ$
   ret
   .L_0005:
   ret
.....

'/

- 'xyz' ASM シンボルを予約した後、fbc は、挿入された ASM ブロックに装飾されていない 'xyz' シンボル (xyz) をバックエンドコンパイラに出力します:
'' for x86_64

#cmdline "-gen gas64 -r"
#pragma reserve(Asm) xyz

Dim Shared xyz As Integer

Sub proc Naked()
    Asm
        xyz
        ret
    End Asm
End Sub

/'
Output in the .Asm file:

   .intel_syntax noprefix
   .section .text
   .text
   .globl PROC
PROC:
   .L_0004:
   xyz
   ret
   .L_0005:
   ret
.....

'/

バージョン: QB との違い: 参照:
プリ・プロセッサ に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2021-11-01 08:35:34
日本語翻訳:WATANABE Makoto、原文著作者:fxm

ホームページのトップに戻る

表示-非営利-継承