前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

26.1. 基本マクロ

26.1.1. SophiaFramework の振る舞いを変更するマクロ

表 26.1. SophiaFramework の振る舞いを変更するマクロ

マクロ 意味
TARGET_EXTENSION_KDDI KDDI 社 BREW 日本拡張パッケージを使うことを宣言します。
TARGET_BUILD_DEBUG デバッグ用ビルドを行うことを宣言します。

デフォルトでは、KDDI 社 BREW 日本拡張パッケージは使わない設定になっています。

BREW 日本拡張パッケージを使うには、SophiaFramework.hpp をインクルードする前に #define 命令を使って TARGET_EXTENSION_KDDI マクロを定義します。

TARGET_BUILD_DEBUG マクロを定義すると、デバッグ用マクロの各マクロが有効になります。

なお、BREW シミュレータ用にビルドを行う場合、TARGET_BUILD_DEBUG マクロは自動的に定義されます。

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

BREW SDK のバージョンやコンパイラの違いなどに応じてコードを使い分けるためのマクロです。

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

マクロ 意味
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 リリース用ビルドが行われることを表します。
[Note] 注意
以上のマクロは SophiaFramework 専用です。開発者は再定義できません。

解説

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

使用例

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

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

TARGET_ENDIAN_BIGTARGET_ENDIAN_LITTLE は、エンディアンの違いに応じてコードを使い分けるためのマクロです。

TARGET_ENVIRONMENT_SIMULATORTARGET_ENVIRONMENT_PHYSICAL は、シミュレーターや実行時のデバイスの違いに応じてコードを使い分けるためのマクロです。

TARGET_VERSION_MAJORTARGET_VERSION_MINORTARGET_VERSION_REVISIONTARGET_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_EQTARGET_VERSION_NETARGET_VERSION_LTTARGET_VERSION_LETARGET_VERSION_GTTARGET_VERSION_GE は、 このバージョン番号と引数として渡されたバージョン番号を比較するためのマクロです。 引数はメジャー バージョン、マイナー バージョン、リビジョンの順です。

使用例

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

26.1.3. 最大値と最小値を表すマクロ

表 26.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 型の最小値

関連情報 :

26.1.4. エラー型

関連情報 : エラー型

26.1.4.1. 擬似例外機構

SophiaFramework では、標準 C++ 言語の例外処理機構のような擬似例外処理機構が提供されます。

表 26.4. 擬似例外機構

関数 意味
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);
};

擬似例外処理機構は SFCApplicationSFRApplication クラスなど static_exception<T> から派生したクラスで使えます。

[Caution] 標準 C++ 言語の例外処理機構との違い

ある関数内で 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()) {
    // エラーに応じた処理
    ...
  }
  ...
}

26.1.5. 型宣言用マクロ

26.1.5.1. SFMTYPEDEFBASE マクロ

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

SFMTYPEDEFBASE(Base)

解説

型名を引数にとり、以下の型宣言を生成します。

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

26.1.5.2. SFMTYPEDEFVOLATILE

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

SFMTYPEDEFVOLATILE(Base)

解説

型名を引数にとり、以下の型宣言を生成します。

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

26.1.5.3. SFMTYPEDEFCONST マクロ

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

SFMTYPEDEFCONST(Base)

解説

型名を引数にとり、以下の型宣言を生成します。

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

26.1.5.4. SFMTYPEDEFVOLATILECONST マクロ

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

SFMTYPEDEFVOLATILECONST(Base)

解説

型名を引数にとり、以下の型宣言を生成します。

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

26.1.5.5. SFMTYPEDEFPACK マクロ

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

SFMTYPEDEFPACK(Base)

解説

型名を引数にとり、以下と等価な型宣言を行います。

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

26.1.5.6. SFMTYPEDEFTYPE マクロ

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

SFMTYPEDEFTYPE(Base)

解説

型名を引数にとり、以下と等価な型宣言を行います。

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

26.1.5.7. SFMTYPEDEFALIAS マクロ

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

SFMTYPEDEFALIAS(Type, Alias)

解説

型名とその別名を引数にとり、以下と等価な型宣言を行います。

typedef Type   Alias;
SFMTYPEDEFTYPE(Alias);

26.1.5.8. SFMTYPEDEFCLASS マクロ

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

SFMTYPEDEFCLASS(Class)

解説

クラス名を引数にとり、以下と等価な型宣言を行います。

class Class;
SFMTYPEDEFTYPE(Class);

使用例

SFMTYPEDEFCLASS(A)
class A {
  ...
}

マクロ展開の例

SFMTYPEDEFTYPE マクロは以下のようにマクロ展開されます。

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:
  ...
};

26.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)

26.1.5.10. SFMTYPEDEFRESPONDER マクロ

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

SFMTYPEDEFRESPONDER(Class)

解説

クラス名を引数にとり、以下と等価な型宣言を行います。

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

26.1.5.11. SFMTYPEDEFSTRUCT マクロ

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

SFMTYPEDEFSTRUCT(Struct)

解説

構造体名を引数にとり、以下の型宣言を行います。

struct Struct;
SFMTYPEDEFTYPE(Struct);

26.1.5.12. SFMTYPEDEFUNION マクロ

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

SFMTYPEDEFUNION(Union)

解説

共用体名を引数にとり、以下の型宣言を行います。

union Union;
SFMTYPEDEFTYPE(Union);

26.1.6. クラス属性マクロ

インスタンスのコピーや代入の禁止するマクロがあります。

26.1.6.1. SFMSEALCONSTRUCT マクロ

インスタンスの生成を禁止するマクロです。

SFMSEALCONSTRUCT(Class)

解説

static メンバのみで構成されるクラスはインスタンスを生成できません。

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

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

使用例

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

26.1.6.2. SFMSEALWRAPPER マクロ

ラッパー クラスのインスタンスの生成を禁止するマクロです。

SFMSEALWRAPPER(Class)

解説

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

26.1.6.3. SFMSEALRESPONDER マクロ

レスポンダ クラスのインスタンスのコピーを禁止するマクロです。

SFMSEALRESPONDER(Class)

解説

レスポンダ クラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALRESPONDER を使います。

26.1.6.4. SFMSEALCOPY マクロ

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

SFMSEALCOPY(Class)

解説

バッファを管理するクラスなどで、インスタンスのコピーに関する問題を回避します。

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

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

26.1.6.5. SFMSEALASSIGN マクロ

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

SFMSEALASSIGN(Class)

解説

クラスのインスタンスの代入に関する問題を回避します。

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

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

26.1.7. 型変換演算子

RealView Compilation Tools for BREW 1.2 などの ARM コンパイラでは、 Visual C++ コンパイラで使える、型変換演算子 reinterpret_caststatic_castdynamic_castconst_cast を利用できません。

[Note] 注意
SophiaFramework はこれらの型変換演算子を C 言語の型変換演算子に置き換えます ( 変数と関数とでこれらの演算子を使い分ける必要があります )。

表 26.5. 標準 C++ 言語と SophiaFramework の型変換演算子

標準 C++ 言語 SophiaFramework 変数用 SophiaFramework 関数用
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] 定数と型変換マクロ

定数に対して型変換マクロを使うと、コンパイル後のバイナリが大きくなります。

26.1.7.1. interface_cast 演算子

interface_cast 演算子は、BREW インターフェースのポインターと、 それに対応する SophiaFramework クラスのポインターを相互に変換するための型変換演算子です。

具体的には、interface_cast 演算子は、BREW の I????? インターフェースと SophiaFramework の SFB????? クラス間、 及び、色、図形、コールバックに関する BREW の AEE????? インターフェースと SophiaFramework のSFX????? クラス間のキャストを行います。

以下は、interface_cast 演算子を使ったサンプル コードです。

SFBFileMgrSmp xfilemgr; // SFBFileMgr クラス(スマート ポインター)
IFileMgr* ifilemgr;     // IFileMgr インターフェース

ifilemgr = interface_cast(xfilemgr.Get()); // SFBFileMgr クラス -> IFileMgr インターフェース

SFBFileMgrSmp xfilemgr; // SFBFileMgr クラス(スマート ポインター)
IFileMgr* ifilemgr;     // IFileMgr インターフェース

xfilemgr.Set(interface_cast(ifilemgr)); // IFileMgr インターフェース -> SFBFileMgr クラス

26.1.7.2. atomic_cast 演算子

atomic_cast 演算子は、図形と色など AtomRec 構造体が定義されるクラスのポインターと、 そのクラスの AtomRec 構造体のポインターを相互に変換するための型変換演算子です。 atomic_cast 演算子により、クラスのポインターは AtomRec 構造体のポインターへ、AtomRec 構造体のポインターはクラスのポインターへそれぞれ型変換されます。

以下は、atomic_cast 演算子を使ったサンプル コードです。

Void my_func(SFXRectangleConst rects[2]) 
{ 
  // 何らかの処理

  ......

} 


SFXRectangle::AtomRecConst rects[] = { 
  {0, 0, 100, 100}, 
  {0, 0, 50, 50} 
}; 


my_func(atomic_cast(rects)); 

26.1.8. その他のマクロ

26.1.8.1. lengthof マクロ

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

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

26.1.8.2. alignof マクロ

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

align64of の他に、1、2、4 バイト用の align08ofalign16ofalign32of マクロがあります。

#define   align08of(type)   ((sizeof(type) + 0) & ~0)
#define   align16of(type)   ((sizeof(type) + 1) & ~1)
#define   align32of(type)   ((sizeof(type) + 3) & ~3)
#define   align64of(type)   ((sizeof(type) + 7) & ~7)

26.1.8.3. clusterof マクロ

cluster64of マクロは、8 バイト境界にアラインしたときに 8 バイトのクラスターがいくつ必要になるかを計算するマクロです。

cluster64of の他に、1、2、4 バイト用の cluster08ofcluster16ofcluster32of マクロがあります。

#define   cluster08of(type)   ((sizeof(type) + 0) >> 0)
#define   cluster16of(type)   ((sizeof(type) + 1) >> 1)
#define   cluster32of(type)   ((sizeof(type) + 3) >> 2)
#define   cluster64of(type)   ((sizeof(type) + 7) >> 3)

26.1.8.4. リテラル

以下は、レスポンダのタイプやアトリビュートなどの識別子用の文字リテラルを生成するためのマクロです。

表 26.6. リテラル生成用マクロ

マクロ 意味
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 で予約されています。

使用例

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

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

生成された値のメモリ上の並びは、エンディアンによらず同じです。

上の例では、*p'A' になります。