{{category 開発情報}} {{category 陰郎の書いた記事,nolink}} !!概要  この記事では、Palm 向けコードリソースにおいて大域データが使用できない関係から、C++ の言語機能の一部が使用できなくなる問題について説明します。   !!説明  Palm OS では、アプリケーションが sysAppLaunchCmdNormalLaunch 以外で起動された場合、大域データを使用することができません。これは、A5 レジスタを介して参照される大域データは sysAppLaunchCmdNormalLaunch 起動された場合のみ設定されることに起因するものです。そのため、コンパイル・リンク時にはエラーも警告も発生しません( CodeWarrior にて確認 )。  C++ の言語機能の一部は、コンパイラが内部的に大域データを使用することで実現されています。これらの機能は、大域データを使用することができないような状況では、使用することができなくなります。CodeWarrior のマニュアルによれば、具体的には以下の言語機能が使用できなくなるとされています。 *ポリモーフィック型の(すなわち仮想関数を持つ)クラスオブジェクトの構築・解体 *例外処理( throw / catch ) *実行時型情報( dynamic_cast など )  また、C++ 標準ライブラリのほとんどの関数・クラス・テンプレート、および new / delete もまた大域データ無しでは動作しないと書かれています。ただし、例外を投入しない new / delete であれば使用できるようです。 !!参考情報   !!注意事項   !!コメント  このページの情報に関する誤りや追加情報がありましたら、コメントをお願いします。 *CodeWarrior は使ったことが無いので gcc の場合と同じように出来るのか分かりませんが,A4 レジスタの置換でうまくいかないでしょうか。 - HAL (2006年06月23日 07時16分53秒) *参考 http://bwinton.latte.ca/Palm/multilink.html , http://prc-tools.sourceforge.net/doc/prc-tools_2.html - HAL (2006年06月23日 07時17分49秒) *最終的に使わなかったのですが,WristPDA の時計モード用アプリで multisegment に挑戦した時に試したことがあります。その時のソースは http://hal9.blog3.fc2.com/blog-entry-81.html にある hwvTimeTable_0.3b.zip の中の hwvTimeTable.c というファイルです。UseGlobalReplace というキーワードで検索すればその前後に関連するコードがあります。 - HAL (2006年06月23日 07時28分29秒) *HAL さん、はじめまして。hwvTimeTable.c を拝見させていただきました。アセンブラは経験が無いのではっきりとはわからないのですが、これは通常OSがやってくれる大域データの設定を自前でやる、ということでしょうか? SAVE_A4_REGISTER というのがそれですよね...またスタックも自前で確保しているように見えますが、やはりアセンブラレベルに不慣れな自分には魔法のように見えます...でも、試して見る価値はすごくありそうなので、挑戦してみます。ありがとうございます。 - 陰郎 (2006年06月23日 10時13分21秒) {{comment}}