![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0 |
表 24.1. SophiaFramework UNIVERSE の振る舞いを変更するマクロ
| マクロ | 意味 |
|---|---|
| TARGET_EXTENSION_KDDI | KDDI 社 BREW 日本拡張パッケージを使うことを宣言します。 |
| TARGET_BUILD_DEBUG | デバッグ用ビルドを行うことを宣言します。 |
デフォルトでは、KDDI 社 BREW 日本拡張パッケージは使わない設定になっています。
BREW 日本拡張パッケージを使うには、SophiaFramework.hpp をインクルードする前に #define 命令を使って TARGET_EXTENSION_KDDI マクロを定義します。
TARGET_BUILD_DEBUG マクロを定義すると、デバッグ用マクロの各マクロが有効になります。
なお、BREW シミュレータ用にビルドを行う場合、TARGET_BUILD_DEBUG マクロは自動的に定義されます。
BREW SDK のバージョンやコンパイラの違いなどに応じてコードを使い分けるためのマクロです。
表 24.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 | リリース用ビルドが行われることを表します。 |
![]() |
注意 |
|---|---|
| 以上のマクロは 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
表 24.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 型の最小値 |
関連情報 : 型
関連情報 : エラー型
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 や SFRApplication クラスなど 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(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base& BaseRef; typedef Base* BasePtr; typedef Base** BaseHandle;
volatile 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFVOLATILE(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base volatile BaseVolatile; typedef BaseVolatile& BaseVolatileRef; typedef BaseVolatile* BaseVolatilePtr; typedef BaseVolatile** BaseVolatileHandle;
const 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFCONST(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base const BaseConst; typedef BaseConst& BaseConstRef; typedef BaseConst* BaseConstPtr; typedef BaseConst** BaseConstHandle;
volatile const 修飾子の付いた参照、ポインタ、ハンドルの型宣言を行います。
SFMTYPEDEFVOLATILECONST(Base)
型名を引数にとり、以下の型宣言を生成します。
typedef Base volatile const BaseVolatileConst; typedef BaseVolatileConst& BaseVolatileConstRef; typedef BaseVolatileConst* BaseVolatileConstPtr; typedef BaseVolatileConst** BaseVolatileConstHandle;
ある型と、その volatile 修飾子付き型、const 修飾子付き型、 volatile const 修飾子付き型に関して、 SFMTYPEDEFBASE を呼び出します。
SFMTYPEDEFPACK(Base)
型名を引数にとり、以下と等価な型宣言を行います。
SFMTYPEDEFBASE(Base) SFMTYPEDEFVOLATILE(Base) SFMTYPEDEFCONST(Base) SFMTYPEDEFVOLATILECONST(Base)
ある型とそのポインタ型、ハンドル型に関して、SFMTYPEDEFPACK を呼び出します。
SFMTYPEDEFTYPE(Base)
ある型の別名を定義し、その別名に関して SFMTYPEDEFTYPE を呼び出します。
SFMTYPEDEFALIAS(Type, Alias)
クラス名とそれに付随する型宣言を行います。
SFMTYPEDEFCLASS(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:
...
};
ラッパークラス名とそれに付随する型宣言を行います。
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)
レスポンダクラス名とそれに付随する型宣言を行います。
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)
構造体とそれに付随する型宣言を行います。
SFMTYPEDEFSTRUCT(Struct)
共用体とそれに付随する型宣言を行います。
SFMTYPEDEFUNION(Union)
AtomRec 構造体からクラスや構造体への暗黙の型変換演算子の宣言を行います。
SFMUTILITYATOMDECLARE(Class)
クラス名または構造体名を引数にとり、 以下のような AtomRec 構造体からそれが定義されるクラスまたは構造体への暗黙の型変換演算子の宣言を生成します。
operator Class&(void); operator Class const&(void) const;
![]() |
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)
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)
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)
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(Class)
static メンバのみで構成されるクラスはインスタンスを生成できません。
クラス名を引数にとり、以下のように展開されます。
private: explicit Class(void); Class(Class const&); ~Class(void); const Class& operator=(Class const&);
SFMTYPEDEFCLASS(A) class A { SFMSEALCONSTRUCT(A) ... }
ラッパークラスのインスタンスの生成を禁止するマクロです。
SFMSEALWRAPPER(Class)
ラッパークラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALWRAPPER を使います。
レスポンダクラスのインスタンスのコピーを禁止するマクロです。
SFMSEALRESPONDER(Class)
レスポンダクラスでは、 SFMSEALCONSTRUCT の代わりに SFMSEALRESPONDER を使います。
インスタンスのコピーを禁止するマクロです。 private のコピー コンストラクタと代入演算子を定義します。
SFMSEALCOPY(Class)
バッファを管理するクラスなどで、インスタンスのコピーに関する問題を回避します。
クラス名を引数にとり、以下のように展開されます。
private: Class(Class const&); Class& operator=(Class const&);
インスタンスの代入を禁止するマクロです。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 は 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 以外のコンパイラでは無視されます。 | |
RealView Compilation Tools for BREW 1.2 などの ARM コンパイラでは、 Visual C++ コンパイラで使える、型変換演算子 reinterpret_cast、static_cast、 dynamic_cast、const_cast を利用できません。
![]() |
注意 |
|---|---|
| SophiaFramework UNIVERSE はこれらの型変換演算子を C 言語の型変換演算子に置き換えます ( 変数と関数とでこれらの演算子を使い分ける必要があります )。 | |
表 24.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 構造体とは、クラスまたは構造体のメンバと同じメモリ配置を持つ C 言語の構造体と互換性のある POD(Plain Old Data) 構造体のことです。 詳細は、RealView コード生成ツールの最適化(Sophia Cradle 社 Web サイト)をご覧ください。 クラスや構造体に AtomRec 構造体を定義すると、 クラスや構造体の初期化コードのサイズと実行速度を最適化することができます。 このとき、AtomRec 構造体を定義するクラスでは仮想関数、多重継承、仮想継承を利用してはいけません。 | |
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)
以下は、レスポンダのタイプやアトリビュートなどの識別子用の文字リテラルを生成するためのマクロです。
表 24.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 - 2008 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|