シンビアンのepoc

困っている現象としては
abldをした時点で、.rsgファイルがNotFoundとなります。
abld実行時に型の未定義等のエラーは他に出ません。

rsgファイルがなぜ生成できないのか不明な為
rcomb.exeを使用し、手動で*.rsgファイルを生成しようと思うのですが
デフォルトでどんなオプションがついて
rcombが実行されているか知ってません??
それか、良い解決法しりません??

rcomp [―v] | [―i] | [―m] | [―p] | [―u]
[―oDataOutputFile] [―hHeaderOutputFile]
[―sSourceFileName] [―iBaseInputFileName]
※Helpより抜粋


http://piza2.2ch.net/tech/kako/977/977989042.html
http://mimizun.com:81/2chlog/tech/piza.2ch.net/tech/kako/977/977989042.html

アプリケーション GUI リソースは、テキストスクリプトファイル (通常、拡張子は .rss ) で定義されています。このファイルはビルド時にバイナリファイルに圧縮コンパイルされ、このバイナリファイルがランタイムで使用されます (デフォルトの拡張子は .rsc ) 。リソースファイルは、プログラム本体を再コンパイルせずにローカライゼーションできます。ローカライゼーションを容易にするため、通常、全てのユーザインタフェーステキストは別のヘッダファイルに分離されます (通常、拡張子 .loc が付きます) 。このヘッダファイルがメインリソースファイルにインクルード (#include) されます。後に各種言語への翻訳のために転送されるのはこの .loc ファイルです。

アプリケーションキャプションリソースを使用して、 2 通りの長さのキャプション (アプリケーション名) を複数言語で提供することができます。キャプションは、例えば Series 60 UI の“ app launcher ”の画面でアプリケーションのアイコンと共に表示されます。フルビルドではこれらのファイルもリソースコンパイラによって処理されます。詳細は、後述の「 3.6 AIF ファイル 」をご覧ください。

リソースコンパイラ (rcomp.exe) は、 Visual C++ IDE から、あるいはコマンドプロンプトから起動します。通常、リソースコンパイラは、リソースファイルを C++ プリプロセッサに渡す処理と、それを rcomp.exe でコンパイルする処理を組み合わせたコマンドファイル (epocrc.bat) を通じて起動します。コンパイルの結果、バイナリアウトプットファイルと .rsg ヘッダファイルが生成されます。このヘッダファイルは、テキスト文字列やダイアログ、メニューコンポーネントといった個々のユーザインタフェースリソースを識別するために C++ コードにインクルード (#include) されます。

http://www.geocities.jp/bleis_tift/cpp/reference.html

C++でのリファレンスとは、エイリアス(別名)のことを意味します。 コンパイラの実装方法にもよりますが、リファレンスはポインタとは違い、 記憶領域を使用しません(しかし実際の実装にはポインタが使われることが多いようです) 。

具体的には次のような状態です。

左がポインタで右がリファレンスです。 ポインタは2つの記憶領域を使用しますが、 リファレンスは変数名の別名に過ぎないので、 一つの記憶領域だけで済みます(図の大きさは関係ありません) 。

ポインタで大事なのはアドレスですが、リファレンスで大事なのは別名です。 ある場所であだ名を付けてもらって、そのあだ名で呼ぶのと本名で呼ぶのに差はないでしょう。 これがリファレンスです。

では実際のコード例を示します。

void func(int* piyo) {
*piyo = 10;
}

int main(void) {
int hoge = 0;
func(&hoge);
return hoge;
}

void func(int& piyo) {
piyo = 10;
}

int main(void) {
int hoge = 0;
func(hoge);
return hoge;
}

どちらもやっていることは同じですが、 上はポインタ、下はリファレンスを用いて実装しています。

ポインタ版では、呼び出し時にアドレス演算子(&)を使用し、 関数にはアドレスを渡しています。 そしてint*型にそのアドレスを格納しています。

つまり、引数部分では次のようなことが行われているわけです。

int* piyo = &hoge; // piyoにhogeのアドレスを代入

実際にこのポインタが指す変数を使用したい場合は間接演算子(*) をしようします。

リファレンス版では呼び出し時は変数名を渡し、 関数ではint&型を使用して渡された変数名の別名を定義します。

つまり、引数部分では次のようなことが行われていると考えます。

int& piyo = hoge; // hogeのあだな(別名)にpiyoと付ける
// (この関数内ではhogeをpiyoという名で扱う)

piyoはただのあだ名ですから、本体は同じです。

ポインタとリファレンスのはこのように関数呼び出しをじっくり見てみることで理解できると思います。 ここはきちんと理解しておいて下さい。

まとめると、ポインタは本体を指し示すものであり、 リファレンスは本体そのもの(のあだ名)と言うことです。
リファレンスの利点

上の例でも分かるように、リファレンスはポインタよりも記述が簡単です。 記述が簡単であると言うことは当然バグも発生しにくくなります。 しかもリファレンスを使用することで「これはポインタをなのか?」 といったわずらわしい解読をしなくても良くなります。 リファレンスを使用する場合は引数の型に"&"を付けることさえ注意すればそれで終わりです。

ちなみにリファレンス宣言時の"&"は演算子ではありません。 今は型(リファレンス型)を表すものと思っておきましょう。 (ついでに言うとポインタ宣言時の"*"もこれと同様で、ポインタ型を表します)

利点はそれだけではなく、コンパイラコンパイル時にリファレンスを表現する領域がなくなるような最適化が許されています。 コンパイラには言語上の制限(thisポインタへの代入禁止など) がないので、上の例で言うpiyoを全てhogeに変えてしまうことで記憶領域の消費をなくすことも可能です。

ポインタで実装している限りこの様なことは出来ません。 ポインタは必ず記憶領域を消費します。

以上のことから、C++でプログラミングをするのであればリファレンスを利用すべきでしょう。 少なくとも外部に公開されている関数の引数や戻り値にはリファレンスを使用しましょう。

ちなみにリファレンスでもポリモフィズムが使えます(おそらく内部でポインタを使用しているのでしょう)。