前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

18.1. SophiaFramework の根幹をなすマクロ・予約語

この節では、SophiaFramework を使いこなすために必要なマクロについて解説します。

18.1.1. SophiaFramework の挙動を変更するマクロ

SophiaFramework の挙動を変更するためのマクロです。

マクロ 意味
TARGET_COMPATIBILITY_224 SophiaFramework Version 2.2.4 との互換性を保ちます。
TARGET_EXTENSION_KDDI KDDI 拡張インターフェイスを使用することを宣言します。
TARGET_BUILD_DEBUG デバッグ用ビルドを行うことを宣言します。

SophiaFramework Version 2.2.4 との互換性を保つためには、 SophiaFramework.hpp をインクルードする直前に TARGET_COMPATIBILITY_224 を定義してください。 このマクロを定義し、ヘッダを使用してもコンパイルが通らない場合があります。 その場合は、ソースコードに若干の修正を加える必要があります。

#define TARGET_COMPATIBILITY_224
#include <SophiaFramework.hpp>

SophiaFrameworkの既定の動作では、KDDI の拡張インターフェイスは 使用できないようになっています。 SophiaFrameworkでKDDI 拡張インターフェイスを使用する場合は、 SophiaFramework.hpp をインクルードする前に#define 命令で TARGET_EXTENSION_KDDI マクロを定義してください。

TARGET_BUILD_DEBUG マクロを定義すると、デバッグ用マクロの各マクロが有効になります。 なお、BREW エミュレータ用にビルドを行う場合は自動的にこのマクロは定義されます。

18.1.2. コードの対象を宣言するマクロ

SophiaFramework には、プログラマが BREW SDK のバージョンや コンパイラの違いなどに応じてコードを使い分られるよう、 次のマクロが定義されています。

これらのマクロは SophiaFramework が自動的に定義しますので、開発者が定義することはできません。

マクロ 意味
TARGET_COMPILER_MSVCPP コンパイラが Visual C++ であることを表します。
TARGET_COMPILER_ARMCPP コンパイラが ARM コンパイラであることを表します。
TARGET_COMPILER_GNUCPP コンパイラが GNU g++ であることを表します。
TARGET_ENDIAN_BIG ビッグ エンディアンを表します。
TARGET_ENDIAN_LITTLE リトル エンディアンを表します。
TARGET_ENVIRONMENT_SIMULATOR BREW エミュレータを表します。
TARGET_ENVIRONMENT_PHYSICAL 実機を表します。
TARGET_VERSION_MAJOR BREW SDK のメジャー バージョンを表します。
TARGET_VERSION_MINOR BREW SDK のマイナー バージョンを表します。
TARGET_VERSION_REVISION BREW SDK のリビジョンを表します。
TARGET_VERSION_BUILD BREW SDK のビルド ナンバー を表します。
TARGET_VERSION_EQ 定義済みの BREW SDK のバージョンと与えられたバージョンとが等しいことを表します。
TARGET_VERSION_NE 定義済みの BREW SDK のバージョンと与えられたバージョンとが異なることを表します。
TARGET_VERSION_LT 定義済みの BREW SDK のバージョンが与えられたバージョンよりも小さいことを表します。
TARGET_VERSION_LE 定義済みの BREW SDK のバージョンが与えられたバージョン以下であることを表します。
TARGET_VERSION_GT 定義済みの BREW SDK のバージョンが与えられたバージョンよりも大きいことを表します。
TARGET_VERSION_GE 定義済みの BREW SDK のバージョンが与えられたバージョン以上であることを表します。
TARGET_BUILD_RELEASE リリース用ビルドが行われることを表します。

解説

TARGET_COMPILER_MSVCPP、TARGET_COMPILER_ARMCPP、TARGET_COMPILER_GNUCPP は、コンパイラに応じてコードを使い分けるためのマクロです。

使用例

UInt32 test(Void)
{
  #if defined TARGET_COMPILER_ARMCPP
  UInt32 temp;

  asm {
    LDR  temp, [pc, #-8]
  }
  return temp;
  #endif
  return 0;
}

同様に、TARGET_ENDIAN_LITTLE、TARGET_ENDIAN_LITTLE はエンディアンの違いに応じて、また、TARGET_ENVIRONMENT_SIMULATOR、 TARGET_ENVIRONMENT_PHYSICAL は実行時のデバイスの違いに応じてコードを 使い分けるためのマクロです。

また、TARGET_VERSION_MAJOR、TARGET_VERSION_MINOR、 TARGET_VERSION_REVISION、TARGET_VERSION_BUILD はいずれも BREW SDK のバージョンを表すためのマクロです。 これらの値はコンパイル時に使用する BREW SDK のバージョンに応じて 自動的に設定されます。

例えば、バージョン番号が 2.1.0、ビルド ナンバーが 20 である BREW SDK を使用する場合、TARGET_VERSION_MAJOR = 2、 TARGET_VERSION_MINOR = 1、TARGET_VERSION_REVISION = 0、 TARGET_VERSION_BUILD = 20 に設定されます。

そして TARGET_VERSION_EQ、TARGET_VERSION_NE、TARGET_VERSION_LT、 TARGET_VERSION_LE、TARGET_VERSION_GT、TARGET_VERSION_GE は、 このバージョン番号と引数として渡されたバージョン番号とを 比較するためのマクロです。 引数はメジャー バージョン、マイナー バージョン、 リビジョンの順です。

使用例

#if TARGET_VERSION_GE(2,1,0)
  // BREW SDK Version 2.1.0 以上の場合
  ...
#else
  // BREW SDK Version 2.1.0 未満の場合
  ...
#endif

18.1.3. 各型の最大値・最小値を表すマクロ

各型の最大値と最小値を表すマクロです。

マクロ 意味
BOOL_MAXIMUM Bool 型の最大値
BOOL_MINIMUM Bool 型の最小値
SINTN_MAXIMUM SIntN 型の最大値
SINTN_MINIMUM SIntN 型の最小値
UINTN_MAXIMUM UIntN 型の最大値
UINTN_MINIMUM UIntN 型の最小値
SINT08_MAXIMUM SInt08 型の最大値
SINT08_MINIMUM SInt08 型の最小値
UINT08_MAXIMUM UInt08 型の最大値
UINT08_MINIMUM UInt08 型の最小値
SINT16_MAXIMUM SInt16 型の最大値
SINT16_MINIMUM SInt16 型の最小値
UINT16_MAXIMUM UInt16 型の最大値
UINT16_MINIMUM UInt16 型の最小値
SINT32_MAXIMUM SInt32 型の最大値
SINT32_MINIMUM SInt32 型の最小値
UINT32_MAXIMUM UInt32 型の最大値
UINT32_MINIMUM UInt32 型の最小値
SINT64_MAXIMUM SInt64 型の最大値
SINT64_MINIMUM SInt64 型の最小値
UINT64_MAXIMUM UInt64 型の最大値
UINT64_MINIMUM UInt64 型の最小値
FLOAT32_MAXIMUM Float32 型の最大値
FLOAT32_MINIMUM Float32 型の最小値
FLOAT64_MAXIMUM Float64 型の最大値
FLOAT64_MINIMUM Float64 型の最小値

それぞれの型については を参照してください。

18.1.4. SophiaFramework でのエラー処理

SophiaFramework で扱うエラーについては エラー型を参照してください。

18.1.4.1. 擬似例外

SophiaFramework には、標準 C++ 言語の例外処理機構と親和性の高い 擬似例外処理機構が搭載されています。

搭載されている関数は次の通りです。

関数 意味
static_catch エラーを取得します。
static_try エラーが発生したかどうかを取得します。
static_throw エラーを設定します。

また関数内部でエラーを設定する場合、 目印として static_throws マクロを使います。 このマクロはプログラマのためのものであり、 何も行いません。

解説

擬似例外処理機構は、static_exception クラスとして提供されています。

template <typename T>
class static_exception {
  public:
    T const& static_catch(Void) const;
  protected:
    Bool static_try(Void) const;
    Void static_throw(static_exception<T> const& param);
    Void static_throw(T const& param);
};

擬似例外処理機構が使用できるのは、static_exception<T> から派生したクラスのみです。

SFCApplication クラス、SFRApplication クラス は static_exception<T> から派生していますので、 これらのクラス内では何処でも擬似例外処理機構を使用できます。

[Caution] 注意事項

標準 C++ 言語の例外とは異なり、 ある関数内で static_throw 関数を呼び出しても その関数を抜けません。 static_throw 関数を呼び出し後にその関数を抜ける必要がある場合は、 static_throw 関数の次に return を記述してください。

使用例

class MyApp : public SFCApplication {
  SFMSEALCOPY(MyApp)
  private:
    Void SubFunc(Void) static_throws;
    SFCError MyAllocation(Void) { ... }  // エラーが発生する可能性のある処理
  public:
    Void MainFunc(Void);
  ...
};

Void SubFunc(Void) static_throws
{
  if (static_try()) {  // 現在のエラーの有無をチェック
    // エラーは発生していない
    static_throw(MyAllocation());  // エラーを設定
  }
  ...
}

Void MainFunc(Void)
{
  ...
  SubFunc();
  switch (static_catch()) {
    // エラーに応じた処理
    ...
  }
  ...
}

18.1.5. 型宣言用マクロ

SophiaFramework には、各種の型宣言用のマクロが用意されています。

18.1.5.1. SFMTYPEDEFBASE マクロ

参照、ポインタ、ハンドルの型宣言を行います。

SFMTYPEDEFBASE(Base)

解説

このマクロは型名を引数にとり、以下のような型宣言を生成します。

typedef Base&    BaseRef;
typedef Base*    BasePtr;
typedef Base**   BaseHandle;

18.1.5.2. SFMTYPEDEFVOLATILE

volatile 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。

SFMTYPEDEFVOLATILE(Base)

解説

このマクロは型名を引数にとり、以下のような型宣言を生成します。

typedef Base volatile    BaseVolatile;
typedef BaseVolatile&    BaseVolatileRef;
typedef BaseVolatile*    BaseVolatilePtr;
typedef BaseVolatile**   BaseVolatileHandle;

18.1.5.3. SFMTYPEDEFCONST マクロ

const 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。

SFMTYPEDEFCONST(Base)

解説

このマクロは型名を引数にとり、以下のような型宣言を生成します。

typedef Base const    BaseConst;
typedef BaseConst&    BaseConstRef;
typedef BaseConst*    BaseConstPtr;
typedef BaseConst**   BaseConstHandle;

18.1.5.4. SFMTYPEDEFVOLATILECONST マクロ

volatile const 修飾子の付いた参照、ポインタ、 ハンドルの型宣言を行います。

SFMTYPEDEFVOLATILECONST(Base)

解説

このマクロは型名を引数にとり、以下のような型宣言を生成します。

typedef Base volatile const   BaseVolatileConst;
typedef BaseVolatileConst&    BaseVolatileConstRef;
typedef BaseVolatileConst*    BaseVolatileConstPtr;
typedef BaseVolatileConst**   BaseVolatileConstHandle;

18.1.5.5. SFMTYPEDEFPACK マクロ

ある型と、その volatile 修飾子付き型、const 修飾子付き型、 volatile const 修飾子付き型それぞれに関して、 SFMTYPEDEFBASE を呼び出します。

SFMTYPEDEFPACK(Base)

解説

このマクロは型名を引数にとり、次と等価な型宣言を行います。

SFMTYPEDEFBASE(Base)
SFMTYPEDEFVOLATILE(Base)
SFMTYPEDEFCONST(Base)
SFMTYPEDEFVOLATILECONST(Base)

18.1.5.6. SFMTYPEDEFTYPE マクロ

ある型とそのポインタ型、ハンドル型それぞれに関して、 SFMTYPEDEFPACK を呼び出します。

SFMTYPEDEFTYPE(Base)

解説

このマクロは型名を引数にとり、次と等価な型宣言を行います。

SFMTYPEDEFPACK(Base)
SFMTYPEDEFPACK(BasePtr)
SFMTYPEDEFPACK(BaseHandle)

18.1.5.7. SFMTYPEDEFALIAS マクロ

ある型の別名を定義し、その別名に関して SFMTYPEDEFTYPE を呼び出します。

SFMTYPEDEFALIAS(Type, Alias)

解説

このマクロは型名とその別名を引数にとり、次と等価な型宣言を行います。

typedef Type   Alias;
SFMTYPEDEFTYPE(Alias);

18.1.5.8. SFMTYPEDEFCLASS マクロ

クラス名とそれに付随する型宣言を行います。

SFMTYPEDEFCLASS(Class)

解説

このマクロはクラス名を引数にとり、 次と等価な型宣言を行います。

class Class;
SFMTYPEDEFTYPE(Class);

使用例

SFMTYPEDEFCLASS(A)
class A {
  ...
}

展開の具体例

SFMTYPEDEFTYPE を使用すると、次の2つは等価になります。

SFMTYPEDEFCLASS(MyClass);
class MyClass {
private:
  ...
};
class MyClass;
typedef MyClass&                     MyClassRef;
typedef MyClass*                     MyClassPtr;
typedef MyClass**                    MyClassHandle;
typedef MyClass volatile             MyClassVolatile;
typedef MyClass volatile&            MyClassVolatileRef;
typedef MyClass volatile*            MyClassVolatilePtr;
typedef MyClass volatile**           MyClassVolatileHandle;
typedef MyClass const                MyClassConst;
typedef MyClass const&               MyClassConstRef;
typedef MyClass const*               MyClassConstPtr;
typedef MyClass const**              MyClassConstHandle;
typedef MyClass volatile const       MyClassVolatileConst;
typedef MyClass volatile const&      MyClassVolatileConstRef;
typedef MyClass volatile const*      MyClassVolatileConstPtr;
typedef MyClass volatile const**     MyClassVolatileConstHandle;
typedef (MyClass*)&                  MyClassPtrRef;
typedef (MyClass*)*                  MyClassPtrPtr;
typedef (MyClass*)**                 MyClassPtrHandle;
typedef MyClass* volatile            MyClassPtrVolatile; 
typedef MyClass* volatile&           MyClassPtrVolatileRef;
typedef MyClass* volatile*           MyClassPtrVolatilePtr;
typedef MyClass* volatile**          MyClassPtrVolatileHandle;
typedef MyClass* const               MyClassPtrConst;
typedef MyClass* const&              MyClassPtrConstRef;
typedef MyClass* const*              MyClassPtrConstPtr;
typedef MyClass* const**             MyClassPtrConstHandle;
typedef MyClass* volatile const      MyClassPtrVolatileConst;
typedef MyClass* volatile const&     MyClassPtrVolatileConstRef;
typedef MyClass* volatile const*     MyClassPtrVolatileConstPtr;
typedef MyClass* volatile const**    MyClassPtrVolatileConstHandle;
typedef (MyClass**)&                 MyClassHandleRef;
typedef (MyClass**)*                 MyClassHandlePtr;
typedef (MyClass**)**                MyClassHandleHandle;
typedef MyClass** volatile           MyClassHandleVolatile;
typedef MyClass** volatile&          MyClassHandleVolatileRef;
typedef MyClass** volatile*          MyClassHandleVolatilePtr;
typedef MyClass** volatile**         MyClassHandleVolatileHandle;
typedef MyClass** const              MyClassHandleConst;
typedef MyClass** const&             MyClassHandleConstRef;
typedef MyClass** const*             MyClassHandleConstPtr;
typedef MyClass** const**            MyClassHandleConstHandle;
typedef MyClass** volatile const     MyClassHandleVolatileConst;
typedef MyClass** volatile const&    MyClassHandleVolatileConstRef;
typedef MyClass** volatile const*    MyClassHandleVolatileConstPtr;
typedef MyClass** volatile const**   MyClassHandleVolatileConstHandle;

class MyClass {
private:
  ...
};

18.1.5.9. SFMTYPEDEFWRAPPER マクロ

ラッパークラス名とそれに付随する型宣言を行います。

SFMTYPEDEFWRAPPER(Class)

解説

このマクロはクラス名を引数にとり、 次と等価な型宣言を行います。

SFMTYPEDEFCLASS(Class)
SFMTYPEDEFALIAS(SFXBrewPointer<Class>, Class##Smp)
SFMTYPEDEFALIAS(SFXBrewPointer<Class volatile>, Class##VolatileSmp)
SFMTYPEDEFALIAS(SFXBrewPointer<Class const>, Class##ConstSmp)
SFMTYPEDEFALIAS(SFXBrewPointer<Class volatile const>, Class##VolatileConstSmp)

18.1.5.10. SFMTYPEDEFSTRUCT マクロ

構造体とそれに付随する型宣言を行います。

SFMTYPEDEFSTRUCT(Struct)

解説

このマクロは構造体名を引数にとり、 次と等価な型宣言を行います。

struct Struct;
SFMTYPEDEFTYPE(Struct);

18.1.5.11. SFMTYPEDEFUNION マクロ

共用体とそれに付随する型宣言を行います。

SFMTYPEDEFUNION(Union)

解説

このマクロは共用体名を引数にとり、 次と等価な型宣言を行います。

union Union;
SFMTYPEDEFTYPE(Union);

18.1.6. クラス属性マクロ

SophiaFramework には、そのクラスのコピーの可否や 代入の可否などを宣言するマクロが用意されています。

18.1.6.1. SFMSEALCONSTRUCT マクロ

クラスの生成を制限するマクロです。

SFMSEALCONSTRUCT(Class)

解説

static メンバしか持たないクラスの場合、 そのクラスを構築することはありえません。 そのようなクラスのために、 SFMSEALCONSTRUCT マクロはコンパイラに対して、 そのクラスが構築できないことを宣言します。

このマクロはクラス名を引数にとり、 以下のように展開されます。

private:
explicit Class(void);
Class(Class const&);
~Class(void);
const Class& operator=(Class const&);

使用例

SFMTYPEDEFCLASS(A)
class A {
  SFMSEALCONSTRUCT(A)
  ...
}

18.1.6.2. SFMSEALWRAPPER マクロ

ラッパークラスの生成を制限するマクロです。

SFMSEALWRAPPER(Class)

解説

ラッパークラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALWRAPPER を使用します。

18.1.6.3. SFMSEALCOPY マクロ

クラスのインスタンスの複製を禁止するためのマクロです。 private のコピーコンストラクタと代入演算子を定義します。

SFMSEALCOPY(Class)

解説

クラス内で独自にバッファの管理を行っている場合など、 クラスの厳密なビット コピーが問題になる場合があります。 予めこのようなクラスのコピーを禁止しておけば、 不用意なコピー操作によって起こる問題を回避することができます。

SFMSEALCOPY マクロはコンパイラに対して、 そのクラスがコピーできないことを宣言します。

このマクロはクラス名を引数にとり、 以下のように展開されます。

private:
Class(Class const&);
Class& operator=(Class const&);

18.1.6.4. SFMSEALASSIGN マクロ

クラスのインスタンスの代入を禁止するためのマクロです。 private の代入演算子を定義します。

SFMSEALASSIGN(Class)

解説

SFMSEALASSIGN マクロはコンパイラに対して そのクラスが代入できないことを宣言し、 不用意な代入操作によって起こる問題を回避します。

このマクロはクラス名を引数にとり、 以下のように展開されます。

private:
Class& operator=(Class const&);

18.1.7. 型変換演算子

安全なコーディングを行うために、標準 C++ 言語では reinterpret_caststatic_castdynamic_castconst_cast 演算子を使用することを推奨しています。 ところが ARM コンパイラによっては、 これらの演算子が使用できない場合があります。

SophiaFramework ではコンパイラを識別して、 ARM コンパイラの場合はこれらの演算子を C 言語の型変換に置き換えます。 ただし、ARM コンパイラへの対応のため、 変換元が変数と関数の違いに応じて 演算子を使い分ける必要があります。

BREW エミュレータによって C++ 言語の型変換を用いた動作チェックが 可能となるため、安全なコーディングが行えます。

標準 C++ の演算子 変数用 関数用
reinterpret_cast reinterpret_cast reinterpret_function_cast
static_cast static_cast static_function_cast
dynamic_cast dynamic_cast dynamic_function_cast
const_cast const_cast const_function_cast
[Caution] 実機上での dynamic_cast 演算子について

ARM コンパイラの制限上、 実機用にコンパイルした場合は dynamic_cast 演算子は C 言語型キャストに変換されます。 従って、実機用にコンパイルした場合ワーニングは出なくなりますが、 ダウン キャストが正しく行われるかどうかは保証されません。

[Tip] ARM コンパイラにおける型変換マクロ使用時の最適化について

定数に対してこれら型変換マクロを使用した場合、 生成されるバイナリが大きくなります。

18.1.8. その他のマクロ

18.1.8.1. lengthof マクロ

lengthof マクロは、配列の長さを取得するためのマクロです。

#define lengthof(Array)  (sizeof((Array)) / sizeof((Array)[0]))

18.1.8.2. alignof マクロ

alignof マクロは、8 バイト境界にアラインしたときのサイズを計算するマクロです。

#define alignof(type)    ((sizeof(type) + 7) & ~7)

18.1.8.3. リテラル

SophiaFramework には、文字リテラルを簡単に生成できるマクロが用意されています。 これらのマクロを使用すれば、文字列から整数値を簡単に生成できます。

マクロ 意味
one_char_code(x) 1 文字リテラルを生成します。
two_char_code(x, y) 2 文字リテラルを生成します。
four_char_code(w, x, y, z) 4 文字リテラルを生成します。

各引数は、AChar 型の値です (バイナリも可能です)。

[Caution] four_char_code マクロ固有の注意点

4 つの引数全てがアルファベットの小文字であるものは SophiaFramework により予約されています。 ウィンドウのクラスやアトリビュートの識別子作成のために このマクロを使用する場合、 SophiaFramework の予約コードと重ならないように注意してください。

使用例

4 文字リテラルの生成例です。

SFCType val = four_char_code('a', 'b', 'c', 'd');
ACharPtr p = reinterpret_cast<ACharPtr>(&val);

これらのマクロで生成される値のメモリ上の並びは、 エンディアンの違いによらず同じになります。

従ってこの例では、*p は 'a' になります。

18.1.9. その他マクロ・予約語

SophiaFramework では標準 C++ との互換性のために、 次の定数と型を用意しています。

定数または型 意味 補足
null 空ポインタ定数を表します。 SophiaFramework では NULL の代わりにこれを使用することが推奨されています。
true 真を表す論理値です。 SophiaFramework では TRUE の代わりにこれを使用することが推奨されています。
false 偽を表す論理値です。 SophiaFramework では FALSE の代わりにこれを使用することが推奨されています。
bool 論理値を表す型です。 SophiaFramework ではこの代わりに Bool 型を使用することが推奨されています。