条件付きコンパイル
いつの間にか、ActiveBasicでも条件付きコンパイルが出来るようになりました。
条件付きコンパイルを使うとコンパイルする範囲を指定できるようになります。
ただ、C言語のものと比べて制約が多いので注意が必要です。
使えるのは以下のものです。
使い方は以下のようにします。
#define _ABC_
#ifdef _ABC_
MessageBox(NULL , "_ABC_は定義されている" , "条件付きコンパイル" , MB_OK)
#else
MessageBox(NULL , "_ABC_は定義されていない" , "条件付きコンパイル" , MB_OK)
#endif
_ABC_を定義し、#ifdef、#elseでそれぞれ条件分岐させています。
#ifndefは#ifdefの反対で、定義されていないときに働きます。
なお、タブを入れるとコンパイラに怒られるようなので注意してください。
これを実行すると「_ABC_は定義されている」と表示されます。
1行目の#define _ABC_をコメントアウトすると「_ABC_は定義されていない」が表示されます。
ヘッダの二重読み込みを防止する
条件付きコンパイルですが、実際に使うケースとしてはこれが多いと思います。
二重読み込みとは、一度定義したものを再び定義することです。
例えば、このようなものです。
'Const2回
Const A=10
Const A=30
'MessageBoxはすでに定義されている
Declare Function MessageBox Lib "user32" Alias "MessageBoxA" ( _
hWnd As HWND, lpText As BytePtr, lpCaption As BytePtr, _
uType As DWord ) As Long
Constで同じ名前は2度定義できません。関数名も同様です。
条件付きコンパイルを使ってActiveBasicでも二重読み込みを防止できるようになります。
'abc.sbp
#ifndef _ABC.SBP_
#define _ABC.SBP_
Const ABC = 123
#endif
'abc.abp
#console
#include"abc.sbp"
#include"abc.sbp"
Print ABC
定義済み識別子
_DEBUG、_WIN64、_AB_VER[num]の3つはABが自動で定義します。
_DEBUGはデバッグコンパイル時に定義されます。
#console
Dim a As Long
a = 10000
debug
#ifdef _DEBUG
Print "デバッグ中だよー"
Print a
#endif
#console
#ifdef _WIN64
Print "Win64です異次元!"
#endif
#console
#ifdef _AB_VER4
Print "ABはバージョン4です"
#endif