条件付きコンパイル

いつの間にか、ActiveBasicでも条件付きコンパイルが出来るようになりました。
条件付きコンパイルを使うとコンパイルする範囲を指定できるようになります。
ただ、C言語のものと比べて制約が多いので注意が必要です。

使えるのは以下のものです。
#define 識別子
#ifdef 識別子
#ifndef
#else
#endif

使い方は以下のようにします。
#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