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

FreeBASIC ModuleConstructor

目次→命令文→手続きCONSTRUCTOR (Module)←オリジナル・サイト

CONSTRUCTOR (モジュール) 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

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

モジュールレベル・コードの前に、手続きの実行を指定します。

構文:
[Public |Private] Sub procedure_name [Alias "external_identifier"] [()]Constructor [priority]
{ 手続きの本体 }
End Sub

記述:
Constructor 予約語は、Sub 定義で使用され、モジュール・レベルのコードに先立って、手続きの実行を強制します。(宣言行レベルでは禁止されています。)
コンストラクタとして定義された手続きは、通常の手続きと同じ方法で使用できます。つまり、他の手続きからだけでなく、モジュール・レベルのコード内から、呼び出すことができます。

手続きは、空のパラメータ・リストが必要です。
Constructor 予約語が、1つ以上のパラメタを持っている Sub 定義に使用されると、コンパイル時にエラーになります。
多重定義の手続きのセットでは、引数を取らない複数の Sub を持つあいまいさのため、1(1) 構築子だけしか定義することができません。

単一モジュールで、ターゲット・システムのビルドおよび実行時環境に応じて:

priority 属性(101 から 65535 までの整数)を使って、同じく priority 属性を持つ他のコンストラクターと対応して、コンストラクターを特定の順序で強制的に実行することができます。
priority の値には特別な意味はなく、他のコンストラクタの優先順位との番号の関係だけがあります。
101が最も優先順位が高く、他の priority 属性を持つコンストラクターと比較して、最初に実行されます。

2つの Public コンストラクタが同じ procedure_name を共有しない限り、1つのモジュールで複数のコンストラクタ手続きを定義でき、複数のモジュールで追加のコンストラクタを定義できます。

コンストラクタも定義しているモジュールとリンクする場合、実行時の順序は、priority 属性を使わない限り、リンク時に保証されません。
したがって、コンストラクタも定義している 2次モジュールを呼び出す可能性があるコンストラクタを使うときには、特に注意が必要です。
このような場合は、これらのモジュールで初期化手続きを明示的に呼び出す、単一のコンストラクタを使うことを推奨します。

ユーザー定義 type の、パブリック静的メンバー手続き(空のパラメータリストを持つ Sub)は、サブ手続きの定義で使われる Constructor キーワードを追加することによって、モジュール・コンストラクタとして定義できます。

コンパイル時に決定できる値(たとえば、デフォルトのゼロ、定数、静的オブジェクトへのポインタ、関数へのポインタなど)を持つ、静的単純数値型変数の初期化は、コードが実行される前に初期化されます。
これらの値は、実行可能イメージの一部であり、実行可能ファイルがメモリにロードされるときに、初期値を持ちます。
コードを初期化する必要がない、簡単な静的グローバルは、確実に初期化され、グローバル静的オブジェクト・コンストラクタやモジュール・コンストラクタを含む、すべてのコードで確実に使用できます。

モジュール・コンストラクター機能は、ビルドおよびランタイム環境の、低レベルのリンク時機能を提示します。
モジュール・コンストラクタから、コンストラクタを持つグローバル静的オブジェクトへのアクセスは、ビルド・システムごとに実行順序が異なるため、避けるべきです。

64-bit コンパイラのみの警告:ユーザー手続きの識別子名の選択については、識別子規則 を参照してください。(特に「プラットフォームの違い」の段落)

例:
'' ConDesExample.bas :
'' 構築子と解体子の2つを定義するプログラム例。
'' 一つのモジュールをリンクするとき、いつ、どんな順に呼ばれるかを示します。

Sub Constructor1() Constructor
    Print "Constructor1() が呼ばれました"
End Sub

Sub Destructor1() Destructor
    Print "Destructor1() が呼ばれました"
End Sub

Sub Constructor2() Constructor
    Print "Constructor2() が呼ばれました"
End Sub

Sub Destructor2() Destructor
    Print "Destructor2() が呼ばれました"
    Sleep
End Sub

    '' ----------------------
    Print "モジュールレベル・コード"
    End 0
    '' ----------------------
 

出力:
Constructor2() が呼ばれました
Constructor1() が呼ばれました
モジュールレベル・コード
Destructor1() が呼ばれました
Destructor2() が呼ばれました


QBからの違い:

参照:

手続きに戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2023-10-13 16:00:39
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

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

表示-非営利-継承