![]() ![]() ![]()
|
BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework 4.1 |
表 23.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 マクロは自動的に定義されます。
BREW SDK のバージョンやコンパイラの違いなどに応じてコードを使い分けるためのマクロです。
表 23.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
表 23.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 では、標準 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)
構造体とそれに付随する型宣言を行います。
SFMTYPEDEFSTRUCT(Struct)
共用体とそれに付随する型宣言を行います。
SFMTYPEDEFUNION(Union)
インスタンスのコピーや代入の禁止するマクロがあります。
インスタンスの生成を禁止するマクロです。
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 を使います。
インスタンスのコピーを禁止するマクロです。 private のコピー コンストラクタと代入演算子を定義します。
SFMSEALCOPY(Class)
バッファを管理するクラスなどで、インスタンスのコピーに関する問題を回避します。
クラス名を引数にとり、以下のように展開されます。
private: Class(Class const&); Class& operator=(Class const&);
RealView Compilation Tools for BREW 1.2 などの ARM コンパイラでは、 Visual C++ コンパイラで使える、型変換演算子 reinterpret_cast、static_cast、 dynamic_cast、const_cast を利用できません。
![]() |
注意 |
|---|---|
| SophiaFramework はこれらの型変換演算子を C 言語の型変換演算子に置き換えます ( 変数と関数とでこれらの演算子を使い分ける必要があります )。 | |
表 23.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 |
![]() |
実機上での dynamic_cast 演算子 |
|---|---|
ARM コンパイラでは dynamic_cast 演算子は C 言語の型変換演算子に置き換えますが、正しくダウン キャストされる保証はありません。 | |
![]() |
定数と型変換マクロ |
|---|---|
定数に対して型変換マクロを使うと、コンパイル後のバイナリが大きくなります。 | |
interface_cast 演算子は、BREW インターフェースのポインターと、 それに対応する SophiaFramework クラスのポインターを相互に変換するための型変換演算子です。
具体的には、interface_cast 演算子は、BREW の I????? インターフェースと SophiaFrameowrk の SFB????? クラス間、 及び、色、図形、イベント、コールバックに関する BREW の AEE????? インターフェースと SophiaFrameowrk の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));
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)
以下は、レスポンダのタイプやアトリビュートなどの識別子用の文字リテラルを生成するためのマクロです。
表 23.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 で予約されています。 | |
4 文字リテラルの生成です。
SFCType val = four_char_code('A', 'b', 'c', 'd');
ACharPtr p = reinterpret_cast<ACharPtr>(&val);
生成された値のメモリ上の並びは、エンディアンによらず同じです。
上の例では、*p は 'A' になります。
|
Copyright (C) 2002 - 2008 Sophia Cradle, Inc. All Rights Reserved. |
![]() ![]() ![]()
|