SophiaFramework UNIVERSE 5.3 |
表 25.1. SophiaFramework UNIVERSE の振る舞いを変更するマクロ
マクロ | 意味 |
---|---|
TARGET_EXTENSION_KDDI | KDDI 社 BREW 日本拡張パッケージを使うことを宣言します。 |
TARGET_BUILD_DEBUG | デバッグ用ビルドを行うことを宣言します。 |
デフォルトでは、KDDI 社 BREW 日本拡張パッケージは使わない設定になっています。
BREW 日本拡張パッケージを使うには、SophiaFramework.hpp をインクルードする前に #define 命令を使用して TARGET_EXTENSION_KDDI マクロを定義します。
TARGET_EXTENSION_KDDI マクロの定義は、Microsoft Visual Studio の [プリプロセッサの定義] 、 RealView Compilation Tools for BREW の -D オプションで代替することも可能です。 通常、この方法で BREW 日本拡張パッケージの使用を指定します。 詳細は、BREW 日本拡張パッケージ C++ ラッパークラスの使用方法を参照してください。
TARGET_BUILD_DEBUG マクロを定義すると、デバッグ用マクロの各マクロが有効になります。
なお、BREW シミュレータ用にビルドを行う場合、TARGET_BUILD_DEBUG マクロは自動的に定義されます。
BREW SDK のバージョンやコンパイラの違いなどに応じてコードを使い分けるためのマクロです。
表 25.2. コードの対象を宣言するマクロ
マクロ | 意味 |
---|---|
TARGET_COMPILER_MSVCPP | コンパイラが Visual C++ であることを表します。 |
TARGET_COMPILER_ARMCPP | コンパイラが ARM コンパイラであることを表します。 |
TARGET_COMPILER_GNUCPP | コンパイラが GNU g++ であることを表します。 |
TARGET_COMPILER_VERSION | コンパイラのバージョンを表します。 |
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 | リリース用ビルドが行われることを表します。 |
注意 | |
---|---|
以上のマクロは SophiaFramework 専用です。開発者は再定義できません。 |
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_BIG と 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
表 25.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 型の最小値 |
これらのマクロは、以下のように定義されています。
// Global range definitions #define BOOL_MAXIMUM (true) #define BOOL_MINIMUM (false) #define SINTN_MAXIMUM (INT_MAX) #define SINTN_MINIMUM (INT_MIN) #define UINTN_MAXIMUM (UINT_MAX) #define UINTN_MINIMUM (0x00000000) #define SINT08_MAXIMUM (SCHAR_MAX) #define SINT08_MINIMUM (SCHAR_MIN) #define UINT08_MAXIMUM (UCHAR_MAX) #define UINT08_MINIMUM (0x00) #define SINT16_MAXIMUM (SHRT_MAX) #define SINT16_MINIMUM (SHRT_MIN) #define UINT16_MAXIMUM (USHRT_MAX) #define UINT16_MINIMUM (0x0000) #define SINT32_MAXIMUM (LONG_MAX) #define SINT32_MINIMUM (LONG_MIN) #define UINT32_MAXIMUM (ULONG_MAX) #define UINT32_MINIMUM (0x00000000L) #if defined TARGET_COMPILER_MSVCPP #define SINT64_MAXIMUM (_I64_MAX) #define SINT64_MINIMUM (_I64_MIN) #define UINT64_MAXIMUM (_UI64_MAX) #define UINT64_MINIMUM (0x0000000000000000I64) #elif defined TARGET_COMPILER_GNUCPP #define SINT64_MAXIMUM (__LONG_LONG_MAX__) #define SINT64_MINIMUM (-SINT64_MAXIMUM - 1LL) #define UINT64_MAXIMUM (SINT64_MAXIMUM * 2ULL + 1ULL) #define UINT64_MINIMUM (0x0000000000000000LL) #else #define SINT64_MAXIMUM (LLONG_MAX) #define SINT64_MINIMUM (LLONG_MIN) #define UINT64_MAXIMUM (ULLONG_MAX) #define UINT64_MINIMUM (0x0000000000000000LL) #endif #define FLOAT32_MAXIMUM (FLT_MAX) #define FLOAT32_MINIMUM (FLT_MIN) #define FLOAT64_MAXIMUM (DBL_MAX) #define FLOAT64_MINIMUM (DBL_MIN)
参照: 型
参照: エラー型
SophiaFramework UNIVERSE では、 標準 C++ 言語の例外処理機構に似た擬似例外処理機構が提供されます。
擬似例外機構を使用してエラーを設定する関数の印として 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); };
擬似例外処理機構は SFCApplication や SFYApplication クラスなど static_exception<T> から派生したクラスで使えます。
標準 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()) { // エラー内容に応じた処理 ... } ... }
SFMTYPEDEFBASE マクロは、 参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFBASE(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base& BaseRef; typedef Base* BasePtr; typedef Base** BaseHandle;
SFMTYPEDEFVOLATILE マクロは、 volatile 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFVOLATILE(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base volatile BaseVolatile; typedef BaseVolatile& BaseVolatileRef; typedef BaseVolatile* BaseVolatilePtr; typedef BaseVolatile** BaseVolatileHandle;
SFMTYPEDEFCONST マクロは、 const 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFCONST(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base const BaseConst; typedef BaseConst& BaseConstRef; typedef BaseConst* BaseConstPtr; typedef BaseConst** BaseConstHandle;
SFMTYPEDEFVOLATILECONST マクロは、 volatile const 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFVOLATILECONST(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base volatile const BaseVolatileConst; typedef BaseVolatileConst& BaseVolatileConstRef; typedef BaseVolatileConst* BaseVolatileConstPtr; typedef BaseVolatileConst** BaseVolatileConstHandle;
SFMTYPEDEFPACK マクロは、 ある型と、その volatile 修飾子付き型、const 修飾子付き型、 volatile const 修飾子付き型に関して、 SFMTYPEDEFBASE を呼び出します。
SFMTYPEDEFPACK(Base)
型名を引数にとり、以下と等価な型宣言を行います。
SFMTYPEDEFBASE(Base) SFMTYPEDEFVOLATILE(Base) SFMTYPEDEFCONST(Base) SFMTYPEDEFVOLATILECONST(Base)
SFMTYPEDEFTYPE マクロは、 ある型とそのポインタ型、ハンドル型に関して、SFMTYPEDEFPACK を呼び出します。
SFMTYPEDEFTYPE(Base)
SFMTYPEDEFALIAS マクロは、 ある型の別名を定義し、 その別名に関して SFMTYPEDEFTYPE を呼び出します。
SFMTYPEDEFALIAS(Type, Alias)
SFMTYPEDEFCLASS マクロは、 クラス名とそれに付随する型宣言を行います。
SFMTYPEDEFCLASS(Class)
SFMTYPEDEFCLASS(A) class A { ... }
SFMTYPEDEFCLASS マクロは、 以下のように展開されます。
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: ... };
SFMTYPEDEFWRAPPER マクロは、 ラッパークラス名とそれに付随する型宣言を行います。
SFMTYPEDEFWRAPPER(Class)
SFBBase クラスを継承するラッパークラス名を引数にとり、 以下と等価な型宣言を行います。
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)
SFMTYPEDEFRESPONDER マクロは、 レスポンダクラス名とそれに付随する型宣言を行います。
SFMTYPEDEFRESPONDER(Class)
SFYResponder クラスを継承するレスポンダクラス名を引数にとり、 以下と等価な型宣言を行います。
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)
SFMTYPEDEFREFOBJECT マクロは、 参照カウントオブジェクトクラス名とそれに付随する型宣言を行います。
SFMTYPEDEFREFOBJECT(Class)
SFORefObject クラスを継承する参照カウントオブジェクトクラス名を引数にとり、 以下と等価な型宣言を行います。
SFMTYPEDEFCLASS(Class) SFMTYPEDEFALIAS(SFXRefObjectPointer<Class>, Class##Smp) SFMTYPEDEFALIAS(SFXRefObjectPointer<Class volatile>, Class##VolatileSmp) SFMTYPEDEFALIAS(SFXRefObjectPointer<Class const>, Class##ConstSmp) SFMTYPEDEFALIAS(SFXRefObjectPointer<Class volatile const>, Class##VolatileConstSmp)
SFMTYPEDEFSTRUCT マクロは、 構造体とそれに付随する型宣言を行います。
SFMTYPEDEFSTRUCT(Struct)
SFMTYPEDEFUNION マクロは、 共用体とそれに付随する型宣言を行います。
SFMTYPEDEFUNION(Union)
SFMUTILITYATOMDECLARE マクロは、 AtomRec 構造体からクラスや構造体への暗黙の型変換演算子の宣言を行います。
SFMUTILITYATOMDECLARE(Class)
クラス名または構造体名を引数にとり、 以下のような AtomRec 構造体からそれが定義されるクラスまたは構造体への暗黙の型変換演算子の宣言を生成します。
operator Class&(void); operator Class const&(void) const;
AtomRec 構造体 | |
---|---|
AtomRec 構造体とは、AtomRec 構造体が定義されるクラスまたは構造体と同じメモリ配置を持つ C 言語の POD(Plain Old Data) 構造体のことです。 詳細は、RealView コード生成ツールの最適化(Sophia Cradle 社 Web サイト)を参照してください。 クラスや構造体に AtomRec 構造体を定義すると、 クラスや構造体の初期化コードのサイズと実行速度を最適化することができます。 このとき、AtomRec 構造体を定義するクラスでは仮想関数、多重継承、仮想継承を利用してはいけません。 AtomRec 構造体を利用するには、 SFMUTILITYATOMDECLARE マクロと SFMUTILITYATOMIMPLEMENT マクロを使用して AtomRec 構造体からクラスまたは構造体への暗黙の型変換演算子と、 SFMUTILITYATOMICCASTDECLARE マクロと SFMUTILITYATOMICCASTIMPLEMENT マクロを使用して AtomRec 構造体と、クラスまたは構造体の相互型変換関数(atomic_cast 演算子)を実装する必要があります。 AtomRec 構造体は、SFXEvent, SFXEventRange, 図形と色のクラスなどで利用されています。 |
注意 | |
---|---|
SFMUTILITYATOMDECLARE マクロを使用するときは、 これらの実装用マクロである SFMUTILITYATOMIMPLEMENT マクロも利用する必要があります。 |
通常、 このマクロは、 AtomRec 構造体が定義されるクラスまたは構造体と AtomRec 構造体を相互に型変換する関数(atomic_cast 演算子)の宣言・実装に使われる SFMUTILITYATOMICCASTDECLARE / SFMUTILITYATOMICCASTIMPLEMENT マクロと一緒に利用されます。
class Class { public: SFMTYPEDEFSTRUCT(AtomRec) struct AtomRec { SFMUTILITYATOMDECLARE(Class) ... } SFMUTILITYATOMICCASTDECLARE(Class, AtomRec) SFMUTILITYATOMIMPLEMENT(Class, AtomRec) SFMUTILITYATOMICCASTIMPLEMENT(Class, AtomRec)
SFMUTILITYATOMIMPLEMENT マクロは、 AtomRec 構造体からクラスまたは構造体への暗黙の型変換演算子を実装します。
SFMUTILITYATOMIMPLEMENT(Class, AtomicRec)
クラス名または構造体名と AtomRec 構造体名を引数にとり、 以下のような AtomRec 構造体からそれが定義されるクラスまたは構造体への暗黙の型変換演算子の実装を生成します。
inline Class::AtomicRec::operator Class&(void) { return *reinterpret_cast<Class*>(this); } inline Class::AtomicRec::operator Class const&(void) const { return *reinterpret_cast<Class const*>(this); }
注意 | |
---|---|
SFMUTILITYATOMIMPLEMENT マクロは、 実装用マクロとして SFMUTILITYATOMDECLARE マクロと一緒に使います。 |
class Class { public: SFMTYPEDEFSTRUCT(AtomRec) struct AtomRec { SFMUTILITYATOMDECLARE(Class) ... } SFMUTILITYATOMICCASTDECLARE(Class, AtomRec) SFMUTILITYATOMIMPLEMENT(Class, AtomRec) SFMUTILITYATOMICCASTIMPLEMENT(Class, AtomRec)
SFMUTILITYATOMICCASTDECLARE マクロは、 AtomRec 構造体が定義されるクラスまたは構造体と AtomRec 構造体を相互に型変換する関数(atomic_cast 演算子)の宣言を行います。
SFMUTILITYATOMICCASTDECLARE(Class, AtomRec)
クラス名または構造体名と AtomRec 構造体名を引数にとり、 以下のような AtomRec 構造体が定義されるクラスまたは構造体と、AtomRec 構造体を相互に型変換する関数(atomic_cast 演算子)の宣言を生成します。
extern Class* atomic_cast(Class::AtomRec* param); extern Class const* atomic_cast(Class::AtomRec const* param); extern Class::AtomRec* atomic_cast(Class* param); extern Class::AtomRec const* atomic_cast(Class const* param);
注意 | |
---|---|
SFMUTILITYATOMICCASTDECLARE マクロを使用するときは、 これらの実装用マクロである SFMUTILITYATOMICCASTIMPLEMENT マクロも利用する必要があります。 |
通常、 このマクロは、 AtomRec 構造体からそれが定義されるクラスまたは構造体への暗黙の型変換演算子の宣言・実装に使われる SFMUTILITYATOMDECLARE / SFMUTILITYATOMIMPLEMENT マクロと一緒に利用されます。
class Class { public: SFMTYPEDEFSTRUCT(AtomRec) struct AtomRec { SFMUTILITYATOMDECLARE(Class) ... } SFMUTILITYATOMICCASTDECLARE(Class, AtomRec) SFMUTILITYATOMIMPLEMENT(Class, AtomRec) SFMUTILITYATOMICCASTIMPLEMENT(Class, AtomRec)
SFMUTILITYATOMICCASTIMPLEMENT マクロは、 AtomRec 構造体が定義されるクラスまたは構造体と、 AtomRec 構造体を相互に型変換する関数(atomic_cast 演算子)を実装します。
SFMUTILITYATOMICCASTIMPLEMENT(Class, AtomicRec)
クラス名または構造体名とその AtomRec 構造体名を引数にとり、 以下のような AtomRec 構造体が定義されるクラスまたは構造体と、AtomRec 構造体を相互に型変換する関数(atomic_cast 演算子)を生成します。
inline Class::AtomicRec* atomic_cast(Class* param) { return reinterpret_cast<Class::AtomicRec*>(param); } inline Class::AtomicRec const* atomic_cast(Class const* param) { return reinterpret_cast<Class::AtomicRec const*>(param); } inline Class* atomic_cast(Class::AtomicRec* param) { return reinterpret_cast<Class*>(param); } inline Class const* atomic_cast(Class::AtomicRec const* param) { return reinterpret_cast<Class const*>(param); }
注意 | |
---|---|
SFMUTILITYATOMICCASTIMPLEMENT マクロは、 実装用マクロとして SFMUTILITYATOMICCASTDECLARE マクロと一緒に使います。 |
class Class { public: SFMTYPEDEFSTRUCT(AtomRec) struct AtomRec { SFMUTILITYATOMDECLARE(Class) ... } SFMUTILITYATOMICCASTDECLARE(Class, AtomRec) SFMUTILITYATOMIMPLEMENT(Class, AtomRec) SFMUTILITYATOMICCASTIMPLEMENT(Class, AtomRec)
インスタンスのコピーや代入の禁止するマクロがあります。
SFMSEALCONSTRUCT マクロは、 インスタンスの生成を禁止します。
SFMSEALCONSTRUCT(Class)
static メンバのみで構成されるクラスはインスタンスを生成できません。
クラス名を引数にとり、以下のように展開されます。
private: explicit Class(void); Class(Class const&); ~Class(void); const Class& operator=(Class const&);
SFMTYPEDEFCLASS(A) class A { SFMSEALCONSTRUCT(A) ... }
SFMSEALWRAPPER マクロは、 ラッパークラスのインスタンスのコピーを禁止します。
SFMSEALWRAPPER(Class)
ラッパークラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALWRAPPER を使います。
SFMSEALRESPONDER マクロは、 レスポンダクラスのインスタンスのコピーを禁止します。
SFMSEALRESPONDER(Class)
レスポンダクラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALRESPONDER を使います。
SFMSEALCOPY マクロは、 インスタンスのコピーを禁止します。 private のコピー コンストラクタと代入演算子を定義します。
SFMSEALCOPY(Class)
バッファを管理するクラスなどで、インスタンスのコピーに関する問題を回避します。
クラス名を引数にとり、以下のように展開されます。
private: Class(Class const&); Class& operator=(Class const&);
SFMSEALASSIGN マクロは、 インスタンスの代入を禁止します。 private の代入演算子を定義します。
SFMSEALASSIGN(Class)
クラスのインスタンスの代入に関する問題を回避します。
クラス名を引数にとり、以下のように展開されます。
private: Class& operator=(Class const&);
SFMRESPONDERINSTANTIATE マクロは、 レスポンダクラスの継承関係を記述します。
Tip | |
---|---|
このマクロは RealView Compilation Tools for BREW 1.2 でビルドするときにだけ必要です。 |
SFMRESPONDERINSTANTIATEFOUR(MyWindow, SFZWindow, SFYContainer, SFYWidget, SFYResponder)
新たにレスポンダクラスを定義する場合、SFYResponder クラスからの継承の階層数に応じて SFMRESPONDERINSTANTIATEZERO、SFMRESPONDERINSTANTIATEONE、SFMRESPONDERINSTANTIATETWO、SFMRESPONDERINSTANTIATETHREE、 SFMRESPONDERINSTANTIATEFOUR、SFMRESPONDERINSTANTIATEFIVE、SFMRESPONDERINSTANTIATESIX、SFMRESPONDERINSTANTIATESEVEN マクロ使用して SFYResponder クラスから新たに定義するクラスまでの継承順序を記述する必要があります。
たとえば、以下のような MyWindow レスポンダクラスを考えてみます。 MyWindow は SFZWindow、SFZWindow は SFYContainer、 SFYContainer は SFYWidget、SFYWidget は SFYResponder というように SFYResponder から MyWindow まで 4 階層に渡って継承するので SFMRESPONDERINSTANTIATEFOUR マクロを使います。
SFYResponder からの継承が 3 階層の場合は SFMRESPONDERINSTANTIATETHREE マクロ、5 階層の場合は SFMRESPONDERINSTANTIATEFIVE マクロを使います。7 階層継承する場合の SFMRESPONDERINSTANTIATESEVEN マクロまで用意されています。
RealView Compilation Tools for BREW 1.2 の不具合 | |
---|---|
RealView Compilation Tools for BREW 1.2 コンパイラの不具合を回避するためのマクロです。 RealView Compilation Tools for BREW 1.2 以外のコンパイラでは無視されます。 |
SFMWRAPPERINSTANTIATE マクロは、ラッパークラスの継承関係を記述します。
Tip | |
---|---|
このマクロは RealView Compilation Tools for BREW 1.2 でビルドするときにだけ必要です。 |
SFMWRAPPERINSTANTIATEONE(SFBHash, SFBBase)
新たにラッパークラスを定義する場合、 SFBBase クラスからの継承の階層数に応じて SFMWRAPPERINSTANTIATEZERO、SFMWRAPPERINSTANTIATEONE、SFMWRAPPERINSTANTIATETWO、SFMWRAPPERINSTANTIATETHREE、 SFMWRAPPERINSTANTIATEFOUR、SFMWRAPPERINSTANTIATEFIVE、SFMWRAPPERINSTANTIATESIX、SFMWRAPPERINSTANTIATESEVEN マクロ使用して SFBBase クラスから新たに定義するクラスまでの継承順序を記述する必要があります。
IHash インターフェースは IBase インターフェースを継承しますので、 IBase インターフェースのラッパークラスを SFBBase クラスとすると、 IHash インターフェースのラッパークラスである SFBHash クラスは SFBBase クラスを継承するので SFMWRAPPERINSTANTIATEONE(SFBHash, SFBBase) とマクロ宣言します。
SFBBase クラスでは、継承関係で最上位に位置するので SFMWRAPPERINSTANTIATEZERO マクロを使用してこの部分は SFMWRAPPERINSTANTIATEZERO(SFBBase) とマクロ宣言します。
A、B、C の 3 つのラッパークラスがあり、B は A、C は B をそれぞれ継承する場合は SFMWRAPPERINSTANTIATETWO マクロを使用して SFMWRAPPERINSTANTIATETWO(C, B, A) とマクロ宣言します。
A、B、C、D の 4 つのラッパークラスの場合は SFMWRAPPERINSTANTIATETHREE(D, C, B, A) とマクロ宣言します。
RealView Compilation Tools for BREW 1.2 の不具合 | |
---|---|
RealView Compilation Tools for BREW 1.2 コンパイラの不具合を回避するためのマクロです。 RealView Compilation Tools for BREW 1.2 以外のコンパイラでは無視されます。 |
SFMREFOBJECTINSTANTIATE マクロは、 参照カウントオブジェクトクラスの継承関係を記述します。
Tip | |
---|---|
このマクロは RealView Compilation Tools for BREW 1.2 でビルドするときにだけ必要です。 |
SFMREFOBJECTINSTANTIATETWO(MyTableCellReactor, SFOTableCellReactor, SFORefObject)
新たに参照カウントオブジェクトクラスを定義する場合、SFORefObject クラスからの継承の階層数に応じて SFMREFOBJECTINSTANTIATEZERO、SFMREFOBJECTINSTANTIATEONE、SFMREFOBJECTINSTANTIATETWO、SFMREFOBJECTINSTANTIATETHREE、 SFMREFOBJECTINSTANTIATEFOUR、SFMREFOBJECTINSTANTIATEFIVE、SFMREFOBJECTINSTANTIATESIX、SFMREFOBJECTINSTANTIATESEVEN マクロ使用して SFORefObject クラスから新たに定義するクラスまでの継承順序を記述する必要があります。
たとえば、以下のような MyTableCellReactor クラスを考えてみます。 MyTableCellReactor は SFOTableCellReactor、 SFOTableCellReactor は SFORefObject というように SFORefObject から MyTableCellReactor まで 2 階層に渡って継承するので SFMREFOBJECTINSTANTIATETWO マクロを使います。
SFORefObject からの継承が 3 階層の場合は SFMREFOBJECTINSTANTIATETHREE マクロ、 4 階層の場合は SFMREFOBJECTINSTANTIATEFOUR マクロ、5 階層の場合は SFMREFOBJECTINSTANTIATEFIVE マクロを使います。 7 階層継承する場合の SFMREFOBJECTINSTANTIATESEVEN マクロまで用意されています。
RealView Compilation Tools for BREW 1.2 の不具合 | |
---|---|
RealView Compilation Tools for BREW 1.2 コンパイラの不具合を回避するためのマクロです。 RealView Compilation Tools for BREW 1.2 以外のコンパイラでは無視されます。 |
RealView Compilation Tools for BREW 1.2 などの ARM コンパイラでは、 Visual C++ コンパイラで使える、型変換演算子 reinterpret_cast、static_cast、 dynamic_cast、const_cast を利用できません。
注意 | |
---|---|
SophiaFramework UNIVERSE はこれらの型変換演算子を C 言語の型変換演算子に置き換えます ( 変数と関数とでこれらの演算子を使い分ける必要があります )。 |
表 25.5. 標準 C++ 言語と SophiaFramework UNIVERSE の型変換演算子
標準 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 |
実機上での dynamic_cast 演算子 | |
---|---|
ARM コンパイラでは dynamic_cast 演算子は C 言語の型変換演算子に置き換えますが、正しくダウンキャストされる保証はありません。 |
定数と型変換マクロ | |
---|---|
定数に対して型変換マクロを使うと、コンパイル後のバイナリが大きくなります。 |
static_pointer_cast 演算子は、スマートポインタ型をダウンキャストするための演算子です。
static_pointer_cast 演算子の引数には、ベースとなるクラス名を指定します。 たとえば、SFYResponder::GetChildFront 関数のSFYResponderSmp 型の戻り値を SFZTextButtonControlSmp 型にダウンキャストする場合、 SFZTextButtonControlSmp ではなく、SFZTextButtonControl を static_pointer_cast 演算子の引数に指定します。
// SFYResponderSmp 型から SFZTextButtonControlSmp 型へダウンキャストする SFZTextButtonControlSmp pair = static_pointer_cast<SFZTextButtonControl>(GetThis()->GetChildFront(pairID)); // ※ GetChildFront() は SFYResponderSmp 型の値を返す
interface_cast 演算子は、BREW インターフェースのポインタと、 それに対応する SophiaFramework クラスのポインタを相互に変換するための型変換演算子です。
具体的には、interface_cast 演算子は、BREW の I????? インターフェースと SophiaFramework UNIVERSE の SFB????? クラス間、 および、色、図形、コールバックに関する BREW の AEE????? インターフェースと SophiaFramework UNIVERSE の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 クラス
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));
AtomRec 構造体 | |
---|---|
AtomRec 構造体とは、AtomRec 構造体が定義されるクラスまたは構造体と同じメモリ配置を持つ C 言語の POD(Plain Old Data) 構造体のことです。 詳細は、RealView コード生成ツールの最適化(Sophia Cradle 社 Web サイト)を参照してください。 クラスや構造体に AtomRec 構造体を定義すると、 クラスや構造体の初期化コードのサイズと実行速度を最適化することができます。 このとき、AtomRec 構造体を定義するクラスでは仮想関数、多重継承、仮想継承を利用してはいけません。 |
any_cast 演算子は、SFXAny クラスに格納された値を、元の型に変換するための型変換演算子です。 引数に参照型が渡された場合、格納された値の元の型に関わらず、テンプレート引数に指定された型へと強制的に型変換されます。 一方、引数にポインタ型が渡された場合、格納された値の元の型とテンプレート引数の型とが一致すれば正常に型変換され、適合しなければ null ポインタとして返されます。
以下は、any_cast 演算子を使ったサンプルコードです。
SInt32 i; SFXAnsiString str; SFXAny a; i = 5; str = "abcde"; a = i; TRACE("a = %d", any_cast<SInt32>(a)); TRACE("&&a = %X", any_cast<SInt32>(&a)); TRACE("&&a = %X", any_cast<UInt32>(&a)); a = str; TRACE("a = %s", any_cast<SFXAnsiString>(a).GetCString()); TRACE("&&a = %X", any_cast<SFXAnsiString>(&a)); TRACE("&&a = %X", any_cast<SFXWideString>(&a)); // [結果] // a = 5 // &a = 4CAB524 (アドレス値は実行環境に依存) // &a = 0 // a = abcde // &a = 4CD1E3C (アドレス値は実行環境に依存) // &a = 0
lengthof マクロは、配列の長さを取得するためのマクロです。
#define lengthof(Array) (sizeof((Array)) / sizeof((Array)[0]))
align64of マクロは、8 バイト境界にアラインしたときのサイズを計算するマクロです。
align64of の他に、1、2、4 バイト用の align08of、align16of、align32of マクロがあります。
#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)
cluster64of マクロは、8 バイト境界にアラインしたときに 8 バイトのクラスターがいくつ必要になるかを計算するマクロです。
cluster64of の他に、1、2、4 バイト用の cluster08of、cluster16of、cluster32of マクロがあります。
#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)
以下は、レスポンダのタイプやアトリビュートなどの識別子用の文字リテラルを生成するためのマクロです。
表 25.6. リテラル生成用マクロ
マクロ | 意味 |
---|---|
one_char_code(x) | 1 文字リテラルを生成します。 |
two_char_code(x, y) | 2 文字リテラルを生成します。 |
four_char_code(w, x, y, z) | 4 文字リテラルを生成します。 |
各引数は、AChar 型の値です ( バイナリも可能です )。
four_char_code マクロの注意点 | |
---|---|
小文字アルファベットまたは記号からなる4文字リテラルは SophiaFramework UNIVERSE で予約されています。 アプリ開発用には、大文字アルファベット 4 文字からなる 4 文字リテラルを利用します。 |
4 文字リテラルの生成です。
SFCType val = four_char_code('A', 'b', 'c', 'd'); ACharPtr p = reinterpret_cast<ACharPtr>(&val);
生成された値のメモリ上の並びは、エンディアンによらず同じです。
上の例では、*p は 'A' になります。
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |