2006年01月27日

スタティック DLL の生成

スタティック DLL を生成するためには、プロジェクトファイル ( .mmp ファイル) の TARGETTYPE を dll に設定する必要があります (例 : TARGETTYPE dll ) 。

Series 60 の DLL は、 DLL へのエントリポイントとして E32Dll() メソッドを必ず持つ必要があります。

GLDEF_C TInt E32Dll(TDllReason)
{
return 0;
}

DLL の外部からアクセスする必要のあるメソッドはすべて、ソースファイル (.cpp) でエクスポート (EXPORT_C) し、ヘッダファイル (.h) でインポート (IMPORT_C) する必要があります。

インライン関数

なぜ C でマクロを使うか?マクロは関数に比べてちょっとだけ動作が速くなります。簡単な処理を行ったり、関数ではできない特殊なことをさせるためにマクロを使用しているのではないでしょうか。インライン関数とは、C のマクロに似たものです。

インライン関数は、関数の前に inline をつけることで定義できます。使い方も定義の仕方も普通の関数となんら変わることはありません。ただ単に関数に inline とつけるだけです。

インライン関数として定義された関数は、その関数が呼び出されたところで展開されます。これはプリプロセッサマクロと同じです。呼出しごとに展開されるので実行コードは少し大きくなりますが、マクロと同様に関数呼び出しのオーバーヘッドが回避できます。

inline int min(int x1, int x2){
return (x1 < x2)? x1: x2;
}

インライン関数の利点

ほとんどのコンパイラはデバッグ版の実行コードを作る場合、インライン関数を展開するか、関数として呼び出すかを指定できます。せっかくのインライン関数を展開しないだって?これは、プログラムをステップ実行する場合にインライン関数の部分もトレースできるようになっています。マクロでステップ実行した場合にはマクロの呼び出し部分の実際のコードまでトレースできません。マクロを使って置き換えたコードにバグがあった場合にそれを発見するまでかなり時間がかかることが良くあります。インライン関数ならスイッチ一つでその内部コードまでトレース実行できます。

マクロは引数の型チェックを行いません。C++ は C よりも型のチェックが厳しい言語です。型チェックが厳しいのは、不正な型を使用した場合のバグをなるべくプログラムにいれないようにするためです。しかし、マクロではその引数の型チェックを行わないで展開してしまいます。インライン関数の場合には、通常の関数と同様に型のチェックをしてから展開されます。こちらのほうが断然安全です。

マクロの危険性をあらわすのに、よく min(x++,y); みたいなコードが使われます。これをマクロ展開すると ((x++)<(y)? (x++):(y)) と展開されてしまい、結果的に x は2つ加算されてしまいます。これは非常にわかりづらいバグの誕生です。インライン関数ではこのようなことは起こりません。
マクロの利点

マクロはコンパイラがプログラムをコンパイルする前にプリプロセッサが行うものです。ですからさまざまなトリッキーな事ができます。たとえば、プログラムからは『変数名』を出力するには実際に文字列として変数名を書き込む以外の手段はありません。マクロを使えば変数名も簡単に文字列にできます。以下のマクロは変数名とその値をプリントする物です。
#define INVALID_PRINT(s) printf(#s " is invalid: %d\n", s);

これは展開されると以下のようになります。
INVALID_PRINT(x); → printf("x is invalid: %d\n", x);

マクロを使えば、変数の値でなく変数名そのものを文字列化することが可能です。C/C++ の機能からは直接手で文字列を書く以外は不可能です。このように C/C++ では実現できないマクロ固有の機能を使う場合にはマクロを使う価値があります。
Caution インライン関数の注意

前方参照

インライン関数は完全な前方参照です。つまり、インライン関数を定義した後ろでしかその関数を使うことができません。これはマクロを定義した後でしかそのマクロを使えないのと似ています。たいていのコンパイラではインライン関数をプロトタイプ宣言しても無駄です。いくつかのファイルで共通のインライン関数を使う場合にはヘッダファイルで定義してください。
for, while, switch

インライン関数の中では for() や while(), switch() などの構文は使えません。これらを使うインライン関数は展開されないで一つの関数としてプログラムに組み込まれます。for() や while() を使うインライン関数は普通の関数として定義するかマクロに置き換えてください。これはコンパイルしてもエラーにならず、せいぜい警告されるだけでしょう。警告されなければ、もしかしたら for や while を使うインライン関数を展開してくれているのかも知れません。ちなみに if() 構文はいくらでも組み込めます。
関数ポインタ

インライン関数はコード内に展開されるため、プログラム内でのアドレスはありません。よってインライン関数から関数ポインタを取り出すことはできません。通常は関数ポインタが取り出されるインライン関数は展開されないで一つの関数としてコンパイルされます。

インライン関数

なぜ C でマクロを使うか?マクロは関数に比べてちょっとだけ動作が速くなります。簡単な処理を行ったり、関数ではできない特殊なことをさせるためにマクロを使用しているのではないでしょうか。インライン関数とは、C のマクロに似たものです。

インライン関数は、関数の前に inline をつけることで定義できます。使い方も定義の仕方も普通の関数となんら変わることはありません。ただ単に関数に inline とつけるだけです。

インライン関数として定義された関数は、その関数が呼び出されたところで展開されます。これはプリプロセッサマクロと同じです。呼出しごとに展開されるので実行コードは少し大きくなりますが、マクロと同様に関数呼び出しのオーバーヘッドが回避できます。

inline int min(int x1, int x2){
return (x1

インラインアセンブラ 【inline assembler】

C言語などで記述されたプログラムの一部に、アセンブラコード(機械語と1対1に対応した低級言語によるプログラム)を埋め込むこと。また、そのようなコードの埋め込まれたプログラム。マイクロプロセッサの性能を極限まで引き出して実行速度を高めたい場合や、メモリ使用量を極限まで減らしたい場合、特定のマイクロプロセッサが持つ拡張命令(MMX命令など)を利用したい場合などに使う。実行効率が上がる反面、機械寄りのコードが混じることによりプログラムの見通しが悪くなり、機種依存性が高まるというデメリットもある。

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。